ЭПИЧНЫЕ ГРУВИ
ПАЗЗЛЕРЫ
ВТОРОЙ СЕЗОН:
МЕСТЬ СКОБОК!
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
Ну этих точно никто не знает…
1. Дваклевыхпацананасцене
Ты кто такой?
linkd.in/jbaruch
stackoverflow.com/users/402053/jbaruch
Как два?! А Где второй?!
Вместе мы:
Первый Сезон Хорошо Пошёл!
1. Дваклевыхпацанана сцене
2. Смешные задачки
3. Выголосуете! Да-да!
4. Новыеклевыефутболкилетятв
зал! Лягушки тоже.
5. Унас есть хэштег!
groovypuzzlers
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
Все работает (т.е. не работает) на версии 2.4.4
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
'а'..'я'.each { println it }
B. NoSuchMethodError
C. z
D. Не побежит
A. а
б
в
.
.
.
я
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
Вы знали, да?
('a'..'z').each { println it }
“Все проблемы в программировании
можно решить добавив пару скобок”
John McCarthy, изобретатель LISP
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
def back = 'back'
def quotes = ["I'll be $back",
"I'll be ${-> back}",
"I'll be ${back}",
"I'll be "+back]
println quotes
back = 'bach'
println quotes
A.Никаких Бахов
B.Один Бах
C.Два Баха
D.Три Баха
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
В рантайме отрабатывают только closures,
всё остальное инлайнится
def back = 'back'
def quotes = ["I'll be $back",
"I'll be ${-> back}",
"I'll be ${back}",
"I'll be "+back]
В рантайме отрабатывают только closures,
всё остальное инлайнится
def back = 'back'
def quotes = ["I'll be $back",
"I'll be ${-> back}",
"I'll be ${back}",
"I'll be "+back]
В рантайме отрабатывают только closures,
всё остальное инлайнится
А это единственный
closure
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
Как напечатать 666?
A. def beast = '6' * Math.PI
B. def beast = '6' * '3’
C. def beast = '667' – 1
D. def beast = '6' + '6' + 0 + 6
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
def beast = '6' * Math.PI
def beast = '6' * 3.1415926…
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
/**
* Repeat a String a certain number of times.
*
* @param self a String to be repeated
* @param factor the number of times the String should be repeated
* @return a String composed of a repetition
* @throws IllegalArgumentException if the number of repetitions is < 0
* @since 1.0
*/
public static String multiply(String self, Number factor) {
int size = factor.intValue();
…
}
def beast = '6' * 3.1415926…
def beast = '6' * 3
Pop Quiz!
B. def beast = '6' * '3’
C. def beast = '667' – 1
D. def beast = '6' + '6' + 0 + 6
Куку!
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
@groovy.transform.InheritConstructors
class TreaayeMap extends HashMap {
}
TreaayeMap a = [5]
TreaayeMap b = [6]
println "${a.getClass()} ${a.equals(b)}"
@groovy.transform.InheritConstructors
class TreaayeMap extends HashMap {
}
TreaayeMap a = [5]
TreaayeMap b = [6]
println "${a.getClass()} ${a.equals(b)}"
A. class HashMap true
B. class TreaayeMap false
C. class TreaayeMap true
D.class HashMap false
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
TreaayeMap a = [5]
TreaayeMap a = [5]
TreaayeMap a = [5]
TreaayeMap a = [5]
@groovy.transform.InheritConstructors
class TreaayeMap extends HashMap {
}
TreaayeMap a = [5]
@groovy.transform.InheritConstructors
class TreaayeMap extends HashMap {
}
/**
* Constructs an empty <tt>HashMap</tt> with the specified initial
* capacity and the default load factor (0.75).
*
* @param initialCapacity the initial capacity.
* @throws IllegalArgumentException if the initial capacity is negative.
*/
public HashMap(int initialCapacity)
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
class THERE_CAN_BE_ONLY_ONE { }
class MacLeod {
THERE_CAN_BE_ONLY_ONE getTHERE_CAN_BE_ONLY_ONE() {
Class clazz = THERE_CAN_BE_ONLY_ONE
return clazz.newInstance()
}
}
println new MacLeod().THERE_CAN_BE_ONLY_ONE
class THERE_CAN_BE_ONLY_ONE { }
class MacLeod {
THERE_CAN_BE_ONLY_ONE
getTHERE_CAN_BE_ONLY_ONE() {
Class clazz = THERE_CAN_BE_ONLY_ONE
return clazz.newInstance()
}
}
println new MacLeod().THERE_CAN_BE_ONLY_ONE
A. Не побежит
B. No such property: THERE_CAN_BE_ONLY_ONE for class: MacLeod
C. THERE_CAN_BE_ONLY_ONE@3d74bf60
D. Навернется по-другому
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
A.MultipleCompilationErrorsException
B.StackOverflowError
C.NullPointerException
D.Навернется ещё как-нибудь
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
class MacLeod {
THERE_CAN_BE_ONLY_ONE getTHERE_CAN_BE_ONLY_ONE() {
Class clazz = THERE_CAN_BE_ONLY_ONE
return clazz.newInstance()
}
}
class MacLeod {
THERE_CAN_BE_ONLY_ONE getTHERE_CAN_BE_ONLY_ONE() {
Class clazz = getTHERE_CAN_BE_ONLY_ONE()
return clazz.newInstance()
}
}
Как мы это чиним?
Class<THERE_CAN_BE_ONLY_ONE> clazz = THERE_CAN_BE_ONLY_ONE.class
class MacLeod {
THERE_CAN_BE_ONLY_ONE getTHERE_CAN_BE_ONLY_ONE() {
Class<THERE_CAN_BE_ONLY_ONE> clazz = THERE_CAN_BE_ONLY_ONE.class
return clazz.newInstance()
}
}
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
class MacLeod {
THERE_CAN_BE_ONLY_ONE getTHERE_CAN_BE_ONLY_ONE() {
Class<THERE_CAN_BE_ONLY_ONE> clazz = getTHERE_CAN_BE_ONLY_ONE().class
return clazz.newInstance()
}
}
Как мы это чиним?
Class<THERE_CAN_BE_ONLY_ONE> clazz = (THERE_CAN_BE_ONLY_ONE as Class)
class MacLeod {
THERE_CAN_BE_ONLY_ONE getTHERE_CAN_BE_ONLY_ONE() {
Class<THERE_CAN_BE_ONLY_ONE> clazz = (THERE_CAN_BE_ONLY_ONE as Class)
return clazz.newInstance()
}
}
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
class MacLeod {
THERE_CAN_BE_ONLY_ONE getTHERE_CAN_BE_ONLY_ONE() {
Class<THERE_CAN_BE_ONLY_ONE> clazz = (getTHERE_CAN_BE_ONLY_ONE() as Class)
return clazz.newInstance()
}
}
Как мы это чиним?
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
String truth = 'false'
boolean groovyTruth = truth
println groovyTruth
A.false
B.true
C.ClassCastException
D.Не побежит
String truth = 'false'
boolean groovyTruth = truth
println groovyTruth
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
class Kitty { def fur }
def kitties = [new Kitty(fur: 'soft'),new Kitty(fur: 'warm'),new Kitty(fur: 'purr') ]
println kitties.collect { it.fur }
println kitties*.fur
println kitties.fur
Сколько будет одинаковых строк?
A. Все разные
B. Две одинаковые
C. Все одинаковые
D.Не скомпилируется
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
class Kitty { def fur }
def kitties
println kitties.collect { it.fur }
println kitties*.fur
println kitties.fur
Сколько будет одинаковых строк?
A. Все разные
B. Две одинаковые
C. Все одинаковые
D.Не скомпилируется
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
class Kitty { def fur }
def kitties
println kitties.fur
class Kitty { def fur }
def kitties
println kitties.fur
class Kitty { def fur }
def kitties
println kitties.collect { it.fur }
class Kitty { def fur }
def kitties
println kitties.collect { it.fur }
public static Collection asCollection(Object value) {
if (value == null) {
return Collections.EMPTY_LIST;
}
…
}
class Kitty { def fur }
def kitties
println kitties*.fur
class Kitty { def fur }
def kitties
println kitties*.fur
class Kitty { def fur }
def kitties
println kitties*.fur
[]
null
Caught: java.lang.NullPointerException:
Cannot get property 'fur' on null object
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
ArrayList<String> expendables = [Arnie', 'Chuck', Sly']
def expendable = //кто нибудь из списка сверху
for(String hero in expendables) {
if(hero == expendable){
expendables.remove(hero)
}
}
println expendables
A. Никого
B. Arnie
C. Chuck
D.Sly
ArrayList<String> expendables = [Arnie', 'Chuck', Sly']
def expendable = //кто нибудь из списка сверху
for(String hero in expendables) {
if(hero == expendable){
expendables.remove(hero)
}
}
println expendables
Кого подставить чтобы не было
ConcurrentModificationException?
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
А вас предупреждали
List expendables = Arrays.asList(new String[]{”Arnie", "Chuck", ”Sly"});
String expendable = "Chuck";
Iterator iterator = expendables.iterator();
while(iterator.hasNext()) {
String hero = (String)iterator.next();
if(hero.equals(expendable)) {
expendables.remove(hero);
}
}
Декомпильнём-ка!
while(iterator.hasNext()) {
String hero = (String)iterator.next();
if(hero.equals(expendable)) {
// expendables.remove(hero);
}
}
while(iterator.hasNext()) {
String hero = (String)iterator.next();
if(hero.equals(expendable)) {
// expendables.remove(hero);
}
}
public E next() {
checkForComodification();
…
cursor = i + 1;
}
Модификации
проверяются в
следущем заходе
Готовим индекс к
проверке hasNext() в
следующем заходеpublic boolean hasNext() {
return cursor != size();
}
Выход по индексу
последнего элемента +1 ==
size()
Посмотрим как должно
работать
while(iterator.hasNext()) {
String hero = (String)iterator.next();
if(hero.equals(expendable)) {
// expendables.remove(hero);
}
}
public E next() {
checkForComodification();
…
cursor = i + 1;
}
public boolean hasNext() {
return cursor != size();
}
После Слая курсор равен
3
Size тоже равен 3
Всё ясно. Теперь давайте попортим.
while(iterator.hasNext()) {
String hero = (String)iterator.next();
if(hero.equals(expendable)) {
expendables.remove(hero);
}
}
public E next() {
checkForComodification();
…
cursor = i + 1;
}
public boolean hasNext() {
return cursor != size();
}
В итерации Чака курсор
равен 2
Оп-ля, и size теперь тоже
равен 2!
А всё, никаких next() не будет,
checkForComodification не вызывается!
Теперь мы убираем Чака
Эй, а как же я?!
while(iterator.hasNext()) {
String hero = (String)iterator.next();
if(hero.equals(expendable)) {
expendables.remove(hero);
}
}
public E next() {
checkForComodification();
…
cursor = i + 1;
}
public boolean hasNext() {
return cursor != size();
}
В итерации Слая курсор
равен 3
Теперь размер 2!
2!=3, пошли на еще кружок!
Не важно, что мы уже за концом цикла,
checkForComodification будет вызван!
Убираем елемент
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
assert 1L == 1
println 1L.equals(1)
assert 1L == 1
println 1L.equals(1)
A. Assertion failed
B. true
C. false
D. MissingMethodException
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
A. [[2, 3, 5], [2, 4, 8], [42, 73, 2147483647, 0]]
B. Не побежит
C. [[null, null, null, 5]]
D.null
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
jailhouseRock?:[] + loveMeTender?:[] + rockAroundTheClock?:[]
*Да, это не Элвиса, мы знаем.
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
jailhouseRock?:[] + loveMeTender?:[] + rockAroundTheClock?:[]
A. [null]
B. null
C. []
D. [1,2,3]
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
jailhouseRock?:[] + loveMeTender?:[] + rockAroundTheClock?:[]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
jailhouseRock?:[null]?:[] + rockAroundTheClock?:[]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
jailhouseRock?:[null]?:[1,2,3]?:[]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
jailhouseRock?jailhouseRock:[null]?[null]:[1,2,3]?[1,2,3]:[]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
null?null:[null]?[null]:[1,2,3]?[1,2,3]:[]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
false?null:true?[null]:true?[1,2,3]:[]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
false?null:true?[null]:[1,2,3]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
false?null:[null]
def jailhouseRock
def loveMeTender
def rockAroundTheClock = [1,2,3]
[null]
Как мы это чиним?
(jailhouseRock?:[])+(loveMeTender?:[])+(rockAroundTheClock?:[])
Ну, вы в курсе, да?
Бенчмаркнем на троих?
class Test {
void run() {
long start = System.nanoTime()
try {
throw new Exception('fail!')
}
finally {
long end = System.nanoTime()
long time = end - start
println time
}
}
}
new Test().run()
A. 254106635
Caught: java.lang.Exception: fail!
B. Caught: java.lang.Exception: fail!
254106635
C. MissingPropertyException: No such
property: time for class: Test
D. Не побежит
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
Как работает finally?
def a
try {
//хрень или случится, или нет
a = 'a'
} catch (Exception e) {
a = 'a'
throw e
}
try {
//хрень или случится, или нет
} finally {
def a = 'a'
}
А вот что нам сгенерилось
long start = System.nanoTime()
long end //это сгенерилось
//а где мой long time?!
try {
throw new Exception('fail!')
end = System.nanoTime()
time = end - start
println time
} catch (Exception e){
end = System.nanoTime()
time = end - start
println time
throw e
}
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
Как мы это чиним?
class Test {
void run() {
long start = System.nanoTime()
try {
throw new Exception("fail!")
}
finally {
long end = System.nanoTime()
long time
time = end - start
println time
}
}
}
new Test().run()
Как мы еще это чиним?
long start = System.nanoTime()
try {
throw new Exception('fail!')
}
finally {
long end = System.nanoTime()
long time = end – start
println time
}
А еще можно вот так
@CompileStatic
class Test {
void run() {
long start = System.nanoTime()
try {
throw new Exception('fail!')
}
finally {
long end = System.nanoTime()
long time = end - start
println time
}
}
}
new Test().run()
Кстати,время изменилось с 254106635 на 56845
Выводы
1. Пишите читабельныйкод
2. Комментируйте всетрюки
3. Иногда этобаг
4. Пользуйте staticcodeanalysis-intellij IDEA!
5. Rtfm
6. Скобки! Всегда добавляйтескобки!
Мы продолжаемразвлекаться!
(смотритекакиеуже футболочки
няшные!)
Наткнулись напаззлер? Давайтеего
сюда!
- puzzlers jfrog.com
- Groovypuzzlers
Вот, мы рассылаем футболки, честно!
Понравилось?
Хвалитенасвтвиттерескорее!
groovypuzzlers
- Groovypuzzlers
- jekaborisov
- jbaruch
Непонравилось?
/dev/null
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses

More Related Content

PDF
PDF
Clojure #2 (2014)
PDF
O Babel 7 и немного больше, Артем Яворский
PDF
Оптимизация производительности Python
PDF
Магия в Python: Дескрипторы. Что это?
PDF
Красота и изящность стандартной библиотеки Python
PDF
Pyton – пробуем функциональный стиль
PDF
Spring puzzlers 2
Clojure #2 (2014)
O Babel 7 и немного больше, Артем Яворский
Оптимизация производительности Python
Магия в Python: Дескрипторы. Что это?
Красота и изящность стандартной библиотеки Python
Pyton – пробуем функциональный стиль
Spring puzzlers 2

What's hot (12)

PDF
Дмитрий Прокопцев — R-ссылки в С++11
PDF
Python
PDF
Лекция 12. Быстрее, Python, ещё быстрее.
PPTX
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
PDF
Лекция 2. Всё, что вы хотели знать о функциях в Python.
PDF
Магия метаклассов
PDF
Лекция 11. Тестирование.
PDF
Лекция 3. Декораторы и модуль functools.
PPT
Декораторы в Python и их практическое использование
PDF
Лекция 1. Начало.
PDF
Python и его тормоза
PDF
Лекция 10. Классы 2.
Дмитрий Прокопцев — R-ссылки в С++11
Python
Лекция 12. Быстрее, Python, ещё быстрее.
ЄВГЕН КЛИМЕНКО «Think like a tester, act like an engineer» Lviv QA Day 2019
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Магия метаклассов
Лекция 11. Тестирование.
Лекция 3. Декораторы и модуль functools.
Декораторы в Python и их практическое использование
Лекция 1. Начало.
Python и его тормоза
Лекция 10. Классы 2.
Ad

Viewers also liked (13)

PPTX
PDF
контент маркетинг для B2B
PPTX
Movimientos de cámara
PDF
100 sp 2017_raciones.1
DOCX
Menus Para Casa Restaurante Manolin Valladolid
PDF
200 sp 2017_carta.1
PDF
【要約】学問のすすめ_第2編
PDF
DATUM STUDIO PyCon2016 Turorial
PDF
12 Motivating Quotes to Help You Nail Your Presentation
PDF
Разработка стратегии интернет-маркетинга
PPTX
A Deep Dive into SharePoint 2016 architecture and deployment
PDF
РИФ 2016, Лидогенерация на практике. Примеры успешных кейсов
контент маркетинг для B2B
Movimientos de cámara
100 sp 2017_raciones.1
Menus Para Casa Restaurante Manolin Valladolid
200 sp 2017_carta.1
【要約】学問のすすめ_第2編
DATUM STUDIO PyCon2016 Turorial
12 Motivating Quotes to Help You Nail Your Presentation
Разработка стратегии интернет-маркетинга
A Deep Dive into SharePoint 2016 architecture and deployment
РИФ 2016, Лидогенерация на практике. Примеры успешных кейсов
Ad

Similar to The Epic Groovy Puzzlers S02: The Revenge of the Parentheses (20)

PDF
Groovy jug-moscow-part 1
PDF
Java 8 puzzlers
PPTX
Зачем нужна Scala?
PPTX
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
PDF
Автоматическая генерация тестов по комментариям к программному коду
PPT
9. java lecture library
PDF
Discovering Lambdas in Java 8
PDF
PPS
Groovy presentation on Exception #7 conference
PPT
Msu.Center.Lectures.J04 Std Libs
PPT
04 Стандартная Библиотека
PDF
Scala: что, как и зачем?
PPTX
основы Java переменные, циклы
PPTX
Groovy и Grails. Быстро и обо всём
PDF
Иван Иноземцев — Fantom
PDF
Kotlin на практике
PDF
Groovy presentation.
PDF
Haskell - huge presentation for DevDay about Haskell language
PDF
Devclub 01/2017 - (Не)адекватное Java-интервью
Groovy jug-moscow-part 1
Java 8 puzzlers
Зачем нужна Scala?
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Автоматическая генерация тестов по комментариям к программному коду
9. java lecture library
Discovering Lambdas in Java 8
Groovy presentation on Exception #7 conference
Msu.Center.Lectures.J04 Std Libs
04 Стандартная Библиотека
Scala: что, как и зачем?
основы Java переменные, циклы
Groovy и Grails. Быстро и обо всём
Иван Иноземцев — Fantom
Kotlin на практике
Groovy presentation.
Haskell - huge presentation for DevDay about Haskell language
Devclub 01/2017 - (Не)адекватное Java-интервью

More from JavaDayUA (20)

PDF
STEMing Kids: One workshop at a time
PDF
Flavors of Concurrency in Java
PDF
What to expect from Java 9
PDF
Continuously building, releasing and deploying software: The Revenge of the M...
PDF
20 Years of Java
PDF
How to get the most out of code reviews
PDF
Unlocking the Magic of Monads with Java 8
PDF
Virtual Private Cloud with container technologies for DevOps
PPTX
JShell: An Interactive Shell for the Java Platform
PPTX
Interactive Java Support to your tool -- The JShell API and Architecture
PDF
MapDB - taking Java collections to the next level
PDF
Save Java memory
PDF
Design rationales in the JRockit JVM
PPTX
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
PPTX
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
PPTX
Solution Architecture tips & tricks by Roman Shramkov
PPTX
Testing in Legacy: from Rags to Riches by Taras Slipets
PDF
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
PDF
Spark-driven audience counting by Boris Trofimov
PDF
API first with Swagger and Scala by Slava Schmidt
STEMing Kids: One workshop at a time
Flavors of Concurrency in Java
What to expect from Java 9
Continuously building, releasing and deploying software: The Revenge of the M...
20 Years of Java
How to get the most out of code reviews
Unlocking the Magic of Monads with Java 8
Virtual Private Cloud with container technologies for DevOps
JShell: An Interactive Shell for the Java Platform
Interactive Java Support to your tool -- The JShell API and Architecture
MapDB - taking Java collections to the next level
Save Java memory
Design rationales in the JRockit JVM
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
Solution Architecture tips & tricks by Roman Shramkov
Testing in Legacy: from Rags to Riches by Taras Slipets
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
Spark-driven audience counting by Boris Trofimov
API first with Swagger and Scala by Slava Schmidt

The Epic Groovy Puzzlers S02: The Revenge of the Parentheses