dvbobrov

19 декабря 2016, Сочи, Россия

# Понедельник 31 твит

Доброе утро! На этой неделе с вами из <s>солнечного</s>заснеженного Сочи Дмитрий Бобров (@dvbobrov).

12:55

Я работаю в компании Machine Learning Works, где занимаюсь чем попало, от собственно разработки до CI и системного администрирования.

12:55

Мы поговорим о Java, Spring Boot, AWS, Docker и полезных инструментах для разработки.

12:56
@backendsecret а Machine Learning готовишь?

Несмотря на название компании, в Machine Learning я понимаю примерно ничего, а занимаюсь в основном инфраструктурой… twitter.com/i/web/status/8…

13:00

Итак, мы те сумасшедшие, кто в 2016 занимается веб-поиском в составе приложения для подростков под девизом "Hack math and chill".

13:51

У нас есть пара десятков (микро)сервисов – часть на Java, часть на Python.

13:51

Изменений очень много, и чтобы быстро и единообразно всю эту радость обновлять, мы выбрали Docker.

13:51
@backendsecret что используете для деплоя? Я так понимаю у нас множество хостов. docker-compose для этого не подходит.

Почти все деплоим в Amazon ECS, который распределяет контейнеры по хостам, на которых достаточно ресурсов twitter.com/0xGreg/status/…

13:58

У него есть несколько сущностей: ECS Cluster – набор машин, которые запустили агента и могут запускать таски.

14:04

Task Definition – набор контейнеров с требуемыми ресурсами. Service – правила запуска: на каком кластере и сколько tasks поддерживать.

14:05
@backendsecret есть ли какие-то особенности версионирования сервисов?

Мы собираем образы в TeamCity и заливаем в собственный Docker Registry, используя номер билда как тег twitter.com/mkuleshov/stat…

14:07

В репозитории лежат task definitions в виде yaml. Нехитрый bash-скрипт через AWS CLI выкатывает новую версию в одно из окружений

14:10

После этого переключает Service на новую версию, и ECS постепенно заменяет старые таски новыми

14:11

Отлично, кучу контейнеров запустили, теперь нужно, чтобы они нашли друг друга. Для этого используем Consul consul.io

14:23

Три штуки запущены в режиме сервера, на каждом хосте еще по агенту, с которыми и общаются сервисы

14:26

Тут важно не забыть открыть порты не только на серверах, но и между всеми остальными хостами.

14:36

Иначе начинают отваливаться health checks, и с точки зрения Consul доступность серверов будет "мигать"

14:36
@backendsecret вы их подчищаете потом как-то? А то же их мильон будет

Когда будет очень много, придется сделать. Простого скрипта, который удалит недостижимые слои после удаления тегов,… twitter.com/i/web/status/8…

15:08
@backendsecret а не пробовали Docker Cloud для оркестрации вместо ECS?

Мы начинали раньше, чем он релизнулся. А в чем профит? twitter.com/mkuleshov/stat…

15:33

Немного о проблемах. ECS не позволяет запустить один и тот же контейнер на всех хостах, а нужен был registrator github.com/gliderlabs/reg…

15:37

Пришлось собрать свой AMI, в котором нужные контейнеры запускаются сервисом systemd.

15:39

В какой-то момент диски начали забиваться из-за того, что ECS-агент не подчищает старые образы. Добавили еще один скрипт, следящий за этим

15:42
@backendsecret там definition поприятней. Остальное там как раз проблема, что получается часть в AWS все равно, а часть в DC.

Мы пишем довольно простой и компактный definition в YAML, который преобразуется в JSON для ECS, это не проблема twitter.com/mkuleshov/stat…

15:45

Вообще, стараемся не использовать облачных решений, от которых тяжело будет избавиться, если придется переносить что-то из AWS.

15:59

Ладно, пора бы что-нибудь полезное и по работе сделать, вернусь через пару часов. Вот вам пока пальмы со снегом :) pic.twitter.com/zni1nbL8DG

16:07
@backendsecret а есть проблемы с кросс зависимостями внутри микросервисов? или они у вас каждый сам по себе

Общие зависимости есть, проблем не было. Если будут, то либо тестами поймаем, либо в крайнем случае сломаем staging… twitter.com/i/web/status/8…

18:25
@backendsecret А на Beanstalk не смотрели? Взамен ECS.

Смотрели, но он, как я понимаю, поддерживает только 1 таску на EC2-инстанс, ECS запускает там, где есть свободные р… twitter.com/i/web/status/8…

18:40
@backendsecret а если скажем либы лежат в гите и нужно сделать деплой под develop и production, то есть тянуть разные ревизии либ

Ну да, у нас всё в одном репозитории. Если надо сделать хотфикс на production, отведем от ревизии ветку и соберем и… twitter.com/i/web/status/8…

19:23

Как у вас организован код в репозиториях? Почему?

20:12
@backendsecret да, это ок, у нас везде разные репы и билдить под разные релизы - супер боль
20:14
@backendsecret послушались вот таких статей vinaysahni.com/best-practices…

Там и написано, чтобы зависимости не шарились между проектами. А такое бывает редко twitter.com/raxpost/status…

20:58

# Вторник 29 твитов

Cнова доброе утро! Еще немного про AWS. Правильный способ отдавать контент наружу – Elastic Load Balancer (не полагаться на статические IP)

12:13

Ну мы радостно настроили ELB на HTTPS и заметили, что отдача ответов по частям (SSE) не работает.

12:15

Оказывается, он не умеет в отключение буферизации ответов. Зато умеет работать в режиме TCP с PROXY-протоколом, который поддерживает nginx.

12:17

В режиме TCP, конечно, никакой буферизации нет, и SSE прекрасно работает.

12:27

Если наружу торчит 1-2 хоста, то все это не нужно, конечно – AWS дает несколько статических IP, которые можно привязать к инстансу.

12:31
@backendsecret Что насчет динамеческих лоад балансеров?

Вы имеете в виду новые Application Load Balancers? twitter.com/DevArtem/statu…

14:14

Выполнять одни и те же действия даже с одной машиной по SSH быстро надоедает. Для автоматизации пользуемся Ansible

14:52

Есть прекрасный inventory, позволяющий выполнять действия с протегированными EC2-хостами github.com/ansible/ansibl…

14:54

Плейбуки для него писать поприятнее, чем шаблоны CloudFormation

14:55
@backendsecret а про базы данных будет? Что юзаете для большой даты

Из баз данных используем Cassandra и Elasticsearch. Всякую аналитику сохраняем в Redshift twitter.com/raxpost/status…

16:14
@backendsecret касандра и еластик понятно, а редшифт почему?

Самый простой способ работать с AWS Mobile Analytics. Ну а потом решили и с серверов некоторые вещи писать туда же twitter.com/raxpost/status…

16:38

Визуализацией данных из Redshift занимается Redash redash.io

17:07

Полезная штука для тестирования кода, работающего с Cassandra из Java: github.com/jsevellec/cass…

17:22

Запускается, правда, довольно долго, нужно угадать с таймаутами, чтобы тесты не начали мигать

17:24

Давайте переключимся на Java. Мы используем Spring Boot во всех Java-приложениях.

18:27

Тут можно посмеяться, что в Spring Framework всё настолько переусложнили, что нужен отдельный фреймворк для его конфигурации.

18:27

Но в Spring Boot есть свои полезные фичи. Например, Actuator – набор инструментов для мониторинга и диагностики github.com/spring-project…

18:29

С автоконфигурациями удобно начинать, но потом можно выстрелить себе в ногу, подключив библиотеку и обнаружив пару (десятков) лишних бинов

18:37
@backendsecret советую ещё глянуть holistics

Спасибо, посмотрим. Мы смотрим Apache Zeppelin, у него есть параметризованные запросы, что нам бы пригодилось twitter.com/timrael/status…

21:07
@raxpost @backendsecret хм, а на чём ещё аналитику делать? стандартный же dwh инструмент. Ну ещё greenplum может
21:27
@borovikov @backendsecret я не особо в интерпрайзе, расскажите чем вся эта моднота лучше обычной RDB

Redshift хранит данные поколоночно, соответственно возможно более эффективное сжатие и select части колонок twitter.com/raxpost/status…

22:03

Кстати об аналитике. Разбирались с коллегой, почему числа в разных сервисах мобильной аналитике отличаются.

22:13

Выяснили, что AWS хранит их в UTC, а другой — в своей таймзоне (хорошо хоть в одной и той же)

22:13

В связи с этим у меня давно есть пунктик, что дату-время всегда нужно сохранять как unix timestamp в миллисекундах по UTC

22:18

(У вас может быть по-другому, главное, чтобы везде одинаково)

22:19

Вот хорошее видео про ад с таймзонами youtu.be/-5wpm-gesOY

22:23
@backendsecret Я честно говоря не знаю, кто придумал хранить в локальной таймзоне и без самой таймзоны?!? Такие грабли знакомы...
22:24
@backendsecret это ты ещё не натыкался на прекрасные имплементации unix timestamp с примотанными изолентой таймзонами...

И очень хорошо! twitter.com/komzpa/status/…

22:24

# Среда 2 твита

Например этот Actuator создаёт очень неудобные метрики для #prometheus, на которые я сразу плюнул twitter.com/backendsecret/…
10:52
@backendsecret redshift денег же стоит? Почему не, например, паркет+zeppelin+spark sql? Ускорили такой связкой часть аналитики на порядки

Все денег стоит, в том числе сервера под Spark. Но в эту сторону тоже смотрим и хотим поэкспериментировать twitter.com/qwwdfsad/statu…

11:07

# Четверг 45 твитов

Продолжим про Spring. Много полезных вещей есть в проекте Spring Cloud, оформленном как набор starters для Spring Boot.

13:54

Пароли не очень правильно хранить в репозитории, лучше их доставать откуда-то при запуске приложения. Для этого есть Spring Cloud Config

13:54

Идея в том, чтобы завести Bootstrap Application Context, в котором с HTTP-сервера докачать конфиг и запустить основной ApplicationContext

13:58

Туда же можно засунуть настройки, отличающиеся для разных окружений

13:58

Конечно, есть обертки для Service Discovery, с которыми из коробки работают другие компоненты вроде RestTemplate.

14:06

В профайле для разработки Consul выключен, чтобы не заставлять всех запускать еще и его. Чем меньше нужно для запуска приложения, тем лучше

14:22

Как я уже говорил, выстрелить себе в ногу с автоконфигурацией – раз плюнуть. Подключаете Consul и получаете заблокированный scheduler thread

14:26

По умолчанию он один, и @scheduleD начнет вести себя совсем не так, как вы ожидали github.com/spring-cloud/s…

14:28

"Чем меньше нужно для запуска, тем лучше" – касается и production. Грустно, когда из-за недоступности чего-то приложение уходит в crash loop

14:37

Также не стоит сразу отдавать пользователю ошибку, если при создании ответа один из нескольких сервисов оказался недоступен.

14:53

Если можно собрать без отсутствующего ответа что-нибудь адекватное, покажите то, что есть

14:55

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

15:10

Для этого каждому пользовательскому запросу на входе присваивается случайный ID, кроме того, каждый запрос между сервисами имеет еще один ID

15:14

Такая схема реализована в Spring Cloud Sleuth, он же позволяет отправлять данные в Zipkin (zipkin.io)

15:21

Подробнее о таких вещах можно посмотреть в докладе @m0nstermind. Полезно даже если ваша система гораздо меньше ОК youtube.com/watch?v=TXqbAL…

15:51

Чтобы понимать, что что-то пошло не так, нужен мониторинг. Чтобы понимать, что пора вмешаться, нужны еще и алерты. Кто чем пользуется?

16:46

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

16:48

Одиночный crash, например, стоит залогировать, перезапустить приложение, и никого не трогать. А вот если их много, то пора послать SMS

16:53

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

16:57

Некритичные события оттуда просто попадают в отдельный канал Slack, критичные – еще и в SMS нескольким людям

16:58

Что мониторим: на каждом хосте CPU, память, диски. Какие контейнеры запущены. Каждое приложение шлет внутренние метрики.

17:16

Для Java это потребление heap/non-heap памяти, количество тредов, также шлем время ответов на запросы и некоторые возникающие exceptions.

17:20

У Riemann есть очень простой dashboard, который придется еще долго допиливать до состояния, когда им можно пользоваться как основным

17:22

Тем не менее, быстро посмотреть, какие эвенты сейчас приходят, можно github.com/riemann/rieman…

17:23

Riemann хранит эвенты только короткое время в памяти, для длительного хранения они отправляются в InfluxDB, графики рисуются Grafana.

17:27
@backendsecret да, именно о них.

Не пробовали. Судя по описанию, есть несколько вкусных фич вроде поддержки dynamic port mapping, но нам уже не нужно twitter.com/DevArtem/statu…

17:47
I think that the JEP-261 designers for a large part ignored the theme of testing. None of the 4 options look good b… twitter.com/i/web/status/8…

Тем временем, разработчики систем сборки уже активно пробуют Jigsaw и пытаются его адекватно поддержать. У них с Ja… twitter.com/i/web/status/8…

13:31

Два забавных факта: 1) jar – это тот же zip, в его начало можно дописать что угодно 2) в bash-скрипт после exit можно дописать что угодно.

14:34

Если совместить эти два факта, можно сделать jar, который запускается как любой другой бинарник, без java -jar.

14:34

У плагина Spring Boot для Gradle есть такая опция: springBoot { executable = true }

14:36
@backendsecret @JUGru о, недавно дочитал и, пожалуй, в этом году это самая интересная книга. Могу сказать спасибо @m0nstermind за наводку
14:37
@backendsecret а можешь пример кинуть, как такое ручками создавать?

cat launchscript.sh app.jar > executable.jar
Только следите, чтобы в конце launchscript.sh был exit и перевод строки twitter.com/Bubyakin/statu…

16:20

В скрипте делается что-то вроде java -jar "$0", по желанию можно навешивать флаги JVM, аргументы командной строки, env variables и т. п.

16:23
@backendsecret а с bat'ником такое не прокатит?

Если винда выполняет bat так же, как bash – строчка за строчкой, не валидируя весь файл, то прокатит. Винды под рук… twitter.com/i/web/status/8…

16:27
@backendsecret чё то стремно как то, не7

А что именно стремно? Как раз может быть удобно, если надо какие-нибудь флаги приложению выставить перед запуском twitter.com/ruxeg/status/8…

16:32
@ruxeg @backendsecret Такое использую в линуксовых инсталляторах, когда один sh на несколько мегабайт и ок. :) Не знаю что уж там внутри...

Да примерно то же самое – распаковка архива, лежащего после скрипта и запуск бинаря оттуда twitter.com/Dronmdf/status…

16:44

Расскажу еще историю из серии "хотели как лучше, а получилось как всегда". Заводите вы маленький инстанс в AWS, t2.micro с 64-битным Linux

16:58

Через некоторое время обнаруживаете 100% загрузку CPU, причем отжирает их некий kswapd. Памяти свободной много.

16:58

Потом оказывается, что добрый амазон после запуска делает hotplug еще 128M памяти, которые попадают в зону Normal.

16:59

Но у нас был всего 1G, который помещается в DMA и DMA32, то есть в Normal ничего не было.

17:00

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

17:00
@backendsecret и хотплаг этот было никак не вырубить еще. Вроде кто-то другой рассказывал уже эту историю в этом же аккаунте или я путаю)

Решение было как раз выключить hotplug, а за расследование этой истории спасибо @feelthefrog twitter.com/strizhechenko/…

17:03
@backendsecret вот та же проблема была с виртуалкой в параллелсе. Похоже знаю куда копать теперь
17:07
@Dronmdf @ruxeg @backendsecret это называется shar, раньше инсталлеры Java 4 Linux были такие.
17:37
@backendsecret Исходники для интересующихся: hg.netbeans.org/main/file/tip/…
21:15

# Пятница 18 твитов

Тихо и незаметно пришла пятница. Давайте о будущем. Java-разработчики, девятку уже пробуете? Планируете переход на Jigsaw?

13:04
@backendsecret вот в восьмой прям жирненькая мотивация была, а ща так себе. Это же важно библиотекам и фреймворкам, не?

Больше всего им, конечно. В первую очередь самому JDK. У фреймворков еще и в первую очередь начнет все ломаться twitter.com/ruxeg/status/8…

13:25

Есть подозрение, что еще долго многие будут забивать на модули, насколько это возможно @ruxeg

13:35
@backendsecret ну да, это же не плохо) не то что выдуманная необходимость, просто фича не для всех
14:39
@backendsecret для северных приложений не важен размер рантайма, а пакетная система всегда была. Обидно что для десктопа лучше не станет

Почему? Для каких-нибудь self-contained packages может и станет. twitter.com/visualwatermar…

14:48

А еще, кроме размера рантайма, говорят, модули открывают возможности для некоторых оптимизаций в JIT @visualwatermark

15:14

Отвлечемся немного от Java. AWS тут недавно запустили FPGA-инстансы. aws.amazon.com/ru/blogs/aws/d…

16:14

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

16:22

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

16:29
@backendsecret жду не дождусь когда в паблик запустят
16:53

А что вы с ними делать будете? @ruxeg

16:53

Если просто потрогать хочется, можно и в developer preview записаться ;) @ruxeg

16:55
@backendsecret @POS_troi а по какой сигнатуре определяется начало зипа?

У него индекс в конце, начало определять не нужно en.m.wikipedia.org/wiki/Zip_(file… twitter.com/wolandtel/stat…

9:18

Замечаю, что подобном коде что в Java, что в Groovy вывод типов часто где-то не работает, пока их явно не укажешь issues.apache.org/jira/browse/GR…

13:38

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

13:38

Groovy, кстати, стоит проникнуться хотя бы ради тестов на Spock spockframework.org

17:31

Я пока не проникся настолько, чтобы точно понять, на какой черной магии оно работает, но штука очень удобная

17:33
@backendsecret а индекс смещениями от конца адресуется, что ли?

Именно twitter.com/wolandtel/stat…

21:28

# Суббота 35 твитов

@backendsecret ява разработчики уже пробуют семёрку, хипстеры трогают восьмёрку, девятка до прода доберётся лет через 10, там и попробуем

Да ладно, не все так плохо. Много уже и восьмерки в проде twitter.com/beizero/status…

12:47
@backendsecret зачем нам jigsaw?

Так выбора нет. Разве что не обновляться вообще никогда. Ну более точный контроль за видимостью классов может быть… twitter.com/i/web/status/8…

12:51
@backendsecret @BeiZero На прошлом проекте были 7 и 8, на следующем будет 6.
13:02
@backendsecret это конечно не особо честно, но все явщики пилящие под андроид до сих пор сидят на шесьмой яве и года 2-3 будут ещё сидеть
13:12
@muttnikus @backendsecret @BeiZero а у нас софт для банков на 7ке, но с Groovy :3 внутренние проекты на 8ке и Kotlin

Кстати, на этой неделе вышел Kotlin 1.1-M04. Из значительных изменений в 1.1 обещают async/await и генераторы twitter.com/itiswasted/sta…

20:06

Интересно, что эти вещи не прибиты гвоздями в компиляторе, а по большей части сделаны как библиотека.

20:08

То есть async/await работает на CompletableFuture, но никто не мешает пойти и написать свою реализацию с ListenableFuture, например

20:09

Также в следующем году, видимо, стоит ждать, что окончательно допилят Gradle Script Kotlin, с которым мы получим отличную поддержку в IDE

20:15

В принципе, и с Groovy сейчас неплохо, только ради Gradle его и выучил. Но порог входа может уменьшиться.

20:19

Единственное, что расстраивает – _очень_ медленное обновление проекта в IDEA. Добавил либу в зависимости, и можно идти пить кофе.

20:21

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

20:25
@backendsecret а ты уже пробовал? Я чёт опосаюсь что там нифига не поднимиться, что то слышал что в многомодульных проектах не работает

Еще нет. Конечно, сейчас много чего не поднимется, оно же еще совсем не готово и может сто раз поменяться до релиза twitter.com/ruxeg/status/8…

20:32

Java-проекты мы собираем Gradle. Он делает всё, начиная от компиляции до заливки Docker-образа.

20:51

В идеале, билдскрипты должны быть такими, чтобы можно было скачать репозиторий, запустить одну команду, и проект можно было бы запустить.

20:53

С Gradle легко этого добиться, подключив несколько плагинов, а то, чего не хватает, дописать самому.

21:05

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

21:05

Для сборки Docker есть такая штука github.com/bmuschko/gradl…
Его я обернул в свой плагин, который конфигурирует его таски так, как нужно нам.

21:11

Еще полезный плагин для работы с git: github.com/ajoberstar/grg… Позволяет вытащить инфу о бранче, тегах и т. п.

21:15

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

21:16

Есть готовые плагины для версионирования, использующие git. Может быть удобно использовать что-то такое github.com/nebula-plugins…

21:22

(ну а я со всеми проектами в одном репозитории опять пишу свой велосипед)

21:24

Gradle – это прекрасно, но у нас же еще и Python есть. В Python с системами сборки все гораздо хуже.

21:28

Тем не менее, нашли и научились готовить buildout. Немного плясок с бубном вокруг него и bash, и Python тоже собирается одной командой

21:32

Docker-образы для Python-проектов все равно собираю через Gradle, конечно

21:34
@backendsecret я тоже недавно к этому пришёл. У меня там "интеграция" с энсиблом для деплоя и некоторые тулы для проверки билда
21:38

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

21:41

Сделал шаблоны для Java и Python, которые генерят кучу нужных вещей после пары вопросов. Спасибо @jbaruch за статью habrahabr.ru/post/218205/

21:42
@backendsecret а как вы боритесь с подсветкой синтаксиса и автокомплитом в иде? Идея сносно понимает груви, но с грейдл не складывается

Да никак. Приходится почаще ходить в документацию. Еще плагины пишу, там автокомплит вполне работает. twitter.com/seregasheypak/…

21:45

Хотя нет, вру, иногда все-таки боремся. С помощью публичного багтрекера JetBrains :)

21:50
@backendsecret нашли способы прибить гвоздями зависимости второго (и т.д.) уровней? Чтобы билдаут не качал обновления и не падал на CI.

Как-то не задавались этим вопросом. На CI он по этой причине у нас не падал. twitter.com/__pewpew__/sta…

22:19
А build server не teamcity? twitter.com/backendsecret/…

TeamCity, но там-то все хорошо twitter.com/f1yegor/status…

23:59
@backendsecret AST transformations. Я про это доклад делал несколько лет назад, можно нагуглить видосиков, если интересно.
1:47
@backendsecret интересно, в чём цель такого дизайна?

На вики пишут, что так проще добавлять файлы. Действительно, если бы индекс был в начале, нужно было бы сдвигать вс… twitter.com/i/web/status/8…

10:40
@backendsecret Spock + geb = лучший фреймворк для автотестинга.
10:41

Пришло время заканчивать, спасибо, что читали меня. Всем успехов в наступающем Новом году! На этой и прошлой неделе с вами был @dvbobrov.

13:34

# Воскресенье 18 твитов

@backendsecret ну понятно, что кого-то придется, но вот прям так чтобы бежать с энтузиазмом и попробовать — увольте.
0:34
Если это java c mvn - то может помочь переключиться с mvncentral на bintray - индекс в разы меньше twitter.com/backendsecret/…

Gradle, но и правда помогло – refresh гораздо быстрее, спасибо. Еще лучше галочка "Offline work" помогает twitter.com/f1yegor/status…

1:47

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

20:04

Кроме митапов и конференций, на сайте jug.ru теперь пишут новости про Java

20:06

Блог @aatarasoff, в котором особенно хочется отметить последние посты про заблуждения о DevOps developerblog.info/#open

20:13

Wiki, в которой на русском хорошо пишут про алгоритмы и структуры данных, с псевдокодом и доказательствами neerc.ifmo.ru/wiki/index.php…

20:15

Рядом еще один хороший раздел с вычислительной геометрией neerc.ifmo.ru/wiki/index.php…

20:17

Фреймворк для тестирования распределенных систем от aphyr, разрабатывающего еще и Riemann github.com/jepsen-io/jeps…

20:25

Он же этот инструмент натравливает на разные базы данных и пишет об этом в блог aphyr.com/tags/Jepsen

20:32

Вышедшая в этом году книга от SRE команды Google. Сборник лучших практик про деплой, incident management и т. п. shop.oreilly.com/product/063692…

20:37
@backendsecret Если хочешь - зажигай дальше. До 31.12.

Окей, тогда еще побуду здесь на следующей неделе. twitter.com/dcromster/stat…

21:22

What Every Programmer Should Know About Memory – статья, подробно описывающая, как работает память github.com/tpn/pdfs/blob/…

21:53

И вдогонку немного хардкора про floating point arithmetics docs.oracle.com/cd/E19957-01/8…

21:55

Еще на этой неделе вышел Python 3.6. Добавили string interpolation, новые type annotations, работают над async/await docs.python.org/3.6/whatsnew/3…

22:05
@backendsecret забыл самое главное что дикт теперь на 20-25% меньше памяти занимают (:

Да, реализовали чуть более эффективно, как в pypy morepypy.blogspot.ru/2015/01/faster… twitter.com/vanadium23/sta…

22:20
@vanadium23 @backendsecret и порядок!

Не надо на это полагаться. "The order-preserving aspect of this new implementation is considered an implementation… twitter.com/i/web/status/8…

22:22
@backendsecret а как же cookiecutter? Не звезда в мире Java? :)

Не слышал раньше twitter.com/sysradium/stat…

22:27
@backendsecret я сталкиваюсь с тем, что сахар груви и специфика плагина приводит к тому, что пользователь обязан стать сорс код плагина

Ну да, приходится читать иногда. И не только с Gradle, а вообще везде, куда можно дотянуться. В код спринга я лез г… twitter.com/i/web/status/8…

22:44

github.com

other


@gahcep