├── src ├── ui │ ├── util │ │ ├── mod.rs │ │ └── event.rs │ ├── mod.rs │ ├── app.rs │ └── screen.rs ├── main.rs └── devoxx │ ├── mod.rs │ └── model.rs ├── .gitignore ├── images ├── rusty.png ├── ferris.gif ├── rust-car.png ├── rust-logo.png ├── rust-start.png ├── rust-crates.png ├── rust-logo-rm.png ├── rust-start2.png └── rust-start3.png ├── Cargo.toml ├── devoxx-data ├── talks.txt ├── friday.json ├── tuesday.json └── monday.json ├── README.adoc └── Cargo.lock /src/ui/util/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod event; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | .idea -------------------------------------------------------------------------------- /src/ui/mod.rs: -------------------------------------------------------------------------------- 1 | #[allow(dead_code)] 2 | pub mod util; 3 | pub mod app; 4 | pub mod screen; 5 | 6 | -------------------------------------------------------------------------------- /images/rusty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rusty.png -------------------------------------------------------------------------------- /images/ferris.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/ferris.gif -------------------------------------------------------------------------------- /images/rust-car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rust-car.png -------------------------------------------------------------------------------- /images/rust-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rust-logo.png -------------------------------------------------------------------------------- /images/rust-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rust-start.png -------------------------------------------------------------------------------- /images/rust-crates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rust-crates.png -------------------------------------------------------------------------------- /images/rust-logo-rm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rust-logo-rm.png -------------------------------------------------------------------------------- /images/rust-start2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rust-start2.png -------------------------------------------------------------------------------- /images/rust-start3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyrbell/rust-for-java-developers/HEAD/images/rust-start3.png -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "devoxx-schedule" 3 | version = "0.1.0" 4 | edition = "2018" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | failure = "0.1" 10 | chrono = { version = "0.4", features = ["serde"] } 11 | chrono-tz = { version = "0.5.1", features = ["serde"] } 12 | structopt = { version = "0.3" } 13 | termion = "1.5.3" 14 | tui = "0.6.2" -------------------------------------------------------------------------------- /devoxx-data/talks.txt: -------------------------------------------------------------------------------- 1 | Monty Python meets the Cloud of Doom, 2019-11-04T18:00:00Z 2 | Securing Microservices with OpenID Connect and Spring Security 5, 2019-11-04T12:30:00Z 3 | Java 12 & 13. What's new and noteworthy?, 2019-11-04T12:30:00Z 4 | Rust for Java Developers, 2019-11-04T08:30:00Z 5 | Building your own JDK in 10 steps, 2019-11-04T15:45:00Z 6 | Arthas - Alibaba Java Diagnostic Tool, 2019-11-04T17:15:00Z 7 | Wiremock: because your microservice needs a buddy when you're testing, 2019-11-04T16:30:00Z 8 | I have deployed my app on Minikube... and now what?, 2019-11-04T15:45:00Z 9 | Solving Memory Leaks in the JVM, 2019-11-04T08:30:00Z 10 | Writing Java agents for fun and (not so much) profit, 2019-11-04T16:30:00Z 11 | TweetWalls@Devoxx - Today Tomorrow and Beyond - A Community Get Together, 2019-11-04T18:00:00Z 12 | Money Money Money: can be funny with JSR 354, 2019-11-04T17:15:00Z -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #[allow(dead_code)] 2 | mod devoxx; 3 | mod ui; 4 | 5 | use std::io; 6 | use std::io::Write; 7 | 8 | use structopt::StructOpt; 9 | 10 | fn main() -> Result<(), failure::Error> { 11 | // Parse any command-line arguments 12 | let options = Options::from_args(); 13 | 14 | // Run the app 15 | let result = ui::screen::run(options); 16 | 17 | // Write any errors on exit to the screen 18 | if let Err(e) = result { 19 | let mut stdout = io::stdout(); 20 | stdout.write_all(format!("{:#?}", e).as_bytes())?; 21 | } 22 | Ok(()) 23 | } 24 | 25 | #[derive(Debug, StructOpt)] 26 | #[structopt(name = "devoxx-schedule", about = "A command line tool to browse the Devoxx schedule")] 27 | pub struct Options { 28 | #[structopt(short, long)] 29 | /// Uses the schedule from local disk, instead of the Devoxx API 30 | pub offline: bool 31 | } 32 | -------------------------------------------------------------------------------- /README.adoc: -------------------------------------------------------------------------------- 1 | = Rust for Java Developers workshop 2 | 3 | image::images/rust-car.png[Rust logo] 4 | 5 | An introduction to the https://www.rust-lang.org/[Rust] programming language for Java developers 6 | 7 | Clone this repository then follow the instructions on the link:../../wiki/Lab-part-01[Wiki] 8 | 9 | # Prerequisites 10 | 11 | ## Linux / MacOS 12 | 🦀 Install Rust with link:https://rustup.rs[Rustup] 13 | ```bash 14 | curl https://sh.rustup.rs -sSf | sh 15 | ``` 16 | ## Windows 17 | 18 | 🦀 Install link:https://docs.microsoft.com/en-us/windows/wsl/install-win10[Windows Subsystem for Linux] then follow the Linux instructions above from a WSL terminal 19 | 20 | *** 21 | 22 | 👀 Take a look in `~/.cargo/bin`. `rustc`, `cargo` and `rustup`, should have just been installed there, along with the rest of the Rust toolchain. 23 | 24 | ## IDE 25 | 26 | Setup an IDE of your choice. We strongly recommend the link:https://intellij-rust.github.io[Rust plugin] for Intellij as that's what we'll be coding along with but recognize it's not to everyone's tastes. If you're still determined to use something else, there is a list link:https://github.com/rust-unofficial/awesome-rust#ides[here] which has the usual suspects on it. 27 | 28 | image::images/rust-start3.png[align="center", link="../../wiki/Lab-part-01"] 29 | -------------------------------------------------------------------------------- /src/ui/util/event.rs: -------------------------------------------------------------------------------- 1 | use std::io; 2 | use std::sync::mpsc; 3 | use std::thread; 4 | use std::time::Duration; 5 | 6 | use termion::event::Key; 7 | use termion::input::TermRead; 8 | 9 | pub enum Event { 10 | Input(I), 11 | Tick, 12 | } 13 | 14 | /// A small event handler that wrap termion input and tick events. Each event 15 | /// type is handled in its own thread and returned to a common `Receiver` 16 | pub struct Events { 17 | rx: mpsc::Receiver>, 18 | input_handle: thread::JoinHandle<()>, 19 | tick_handle: thread::JoinHandle<()>, 20 | } 21 | 22 | #[derive(Debug, Clone, Copy)] 23 | pub struct Config { 24 | pub exit_key: Key, 25 | pub tick_rate: Duration, 26 | } 27 | 28 | impl Default for Config { 29 | fn default() -> Config { 30 | Config { 31 | exit_key: Key::Ctrl('c'), 32 | tick_rate: Duration::from_millis(250), 33 | } 34 | } 35 | } 36 | 37 | impl Events { 38 | pub fn new() -> Events { 39 | Events::with_config(Config::default()) 40 | } 41 | 42 | pub fn with_config(config: Config) -> Events { 43 | let (tx, rx) = mpsc::channel(); 44 | let input_handle = { 45 | let tx = tx.clone(); 46 | thread::spawn(move || { 47 | let stdin = io::stdin(); 48 | for evt in stdin.keys() { 49 | match evt { 50 | Ok(key) => { 51 | if let Err(_) = tx.send(Event::Input(key)) { 52 | return; 53 | } 54 | if key == config.exit_key { 55 | return; 56 | } 57 | } 58 | Err(_) => {} 59 | } 60 | } 61 | }) 62 | }; 63 | let tick_handle = { 64 | let tx = tx.clone(); 65 | thread::spawn(move || { 66 | let tx = tx.clone(); 67 | loop { 68 | tx.send(Event::Tick).unwrap(); 69 | thread::sleep(config.tick_rate); 70 | } 71 | }) 72 | }; 73 | Events { 74 | rx, 75 | input_handle, 76 | tick_handle, 77 | } 78 | } 79 | 80 | pub fn next(&self) -> Result, mpsc::RecvError> { 81 | self.rx.recv() 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/devoxx/mod.rs: -------------------------------------------------------------------------------- 1 | use chrono::Weekday; 2 | 3 | use model::Talk; 4 | 5 | pub mod model; 6 | 7 | const DEVOXX_HOST: &str = "dvbe19.cfp.dev"; 8 | 9 | pub fn read_talks() -> Result, failure::Error> { 10 | unimplemented!() 11 | } 12 | 13 | pub fn get_talks_by_weekday(day: &Weekday, _offline: bool) -> Result, failure::Error> { 14 | let day = match day { 15 | Weekday::Mon => "monday", 16 | Weekday::Tue => "tuesday", 17 | Weekday::Wed => "wednesday", 18 | Weekday::Thu => "thursday", 19 | Weekday::Fri => "friday", 20 | _ => "monday" 21 | }; 22 | 23 | // TODO use offline flag 24 | 25 | get_talks_by_day_file(day) 26 | } 27 | 28 | pub fn get_talks() -> Result, failure::Error> { 29 | unimplemented!() 30 | } 31 | 32 | 33 | pub fn get_talks_by_day_file(_day: &str) -> Result, failure::Error> { 34 | unimplemented!() 35 | } 36 | 37 | pub fn get_talks_by_day_api(_day: &str) -> Result, failure::Error> { 38 | unimplemented!() 39 | } 40 | 41 | 42 | #[cfg(test)] 43 | mod tests { 44 | use super::*; 45 | 46 | #[test] 47 | fn test_read_talks() { 48 | let items = read_talks(); 49 | assert_eq!(items.is_ok(), true, "{:?}", items.err()); 50 | if let Ok(talks) = items { 51 | assert_eq!(talks.len(), 12); 52 | assert_eq!(&talks.get(0).unwrap()[..12], "Monty Python"); 53 | } 54 | } 55 | 56 | #[test] #[ignore] 57 | fn test_structured_data() { 58 | let items = get_talks(); 59 | assert_eq!(items.is_ok(), true, "{:?}", items.err()); 60 | if let Ok(items) = items { 61 | assert_eq!(items.len(), 12); 62 | assert_eq!(items.get(0).unwrap().talk_title.as_ref().unwrap(), "Monty Python meets the Cloud of Doom"); 63 | } 64 | } 65 | 66 | #[test] #[ignore] 67 | fn test_get_talks() { 68 | verify_get_talks(get_talks_by_day_file("monday")); 69 | } 70 | 71 | #[test] #[ignore] 72 | fn test_get_talks_api() { 73 | verify_get_talks(get_talks_by_day_api("monday")); 74 | } 75 | 76 | fn verify_get_talks(result: Result, failure::Error>) { 77 | assert_eq!(result.is_ok(), true, "{:?}", result.err()); 78 | let mut found_rust_lab = false; 79 | let expected_title = Some(String::from("Rust for Java Developers")); 80 | if let Ok(talks) = result { 81 | for talk in &talks { 82 | match talk { 83 | Talk { talk_title: title, .. } if title == &expected_title => found_rust_lab = true, 84 | _ => () 85 | }; 86 | } 87 | } 88 | assert_eq!(found_rust_lab, true); 89 | } 90 | } -------------------------------------------------------------------------------- /src/devoxx/model.rs: -------------------------------------------------------------------------------- 1 | use chrono::{DateTime, Utc}; 2 | use std::time::UNIX_EPOCH; 3 | 4 | pub struct Talk { 5 | pub talk_title: Option, 6 | pub talk_description: Option, 7 | pub tags: Option>, 8 | pub room_name: String, 9 | pub from_date: DateTime, 10 | pub to_date: DateTime, 11 | pub session_type_name: Option, 12 | pub speakers: Option>, 13 | pub timezone: String 14 | } 15 | 16 | pub struct Speaker { 17 | pub id: u32, 18 | pub first_name: String, 19 | pub last_name: String, 20 | pub company: Option 21 | } 22 | 23 | pub struct Tag { 24 | pub name: String 25 | } 26 | 27 | impl Talk { 28 | pub fn get_title(&self) -> &str { 29 | "TODO" 30 | } 31 | 32 | pub fn local_from_date(&self) -> String { 33 | "TODO".into() 34 | } 35 | 36 | pub fn local_to_date(&self) -> String { 37 | "TODO".into() 38 | } 39 | 40 | pub fn get_description(&self) -> &str { 41 | "TODO" 42 | } 43 | 44 | pub fn speaker_names(&self) -> String { 45 | "TODO".into() 46 | } 47 | } 48 | 49 | impl Default for Talk { 50 | fn default() -> Self { 51 | Self { 52 | talk_title: None, 53 | talk_description: None, 54 | tags: None, 55 | room_name: "".to_string(), 56 | from_date: DateTime::::from(UNIX_EPOCH), 57 | to_date: DateTime::::from(UNIX_EPOCH), 58 | session_type_name: None, 59 | speakers: None, 60 | timezone: "".to_string() 61 | } 62 | } 63 | } 64 | 65 | #[cfg(test)] 66 | mod tests { 67 | use super::*; 68 | 69 | #[test] #[ignore] 70 | fn test_talk_title() { 71 | let mut talk = Talk::default(); 72 | talk.talk_title = Some(String::from("some title")); 73 | 74 | assert_eq!(talk.get_title(), "some title"); 75 | 76 | let mut talk = Talk::default(); 77 | talk.session_type_name = Some(String::from("Session name")); 78 | 79 | assert_eq!(talk.get_title(), "Session name"); 80 | } 81 | 82 | #[test] #[ignore] 83 | fn test_speaker_names() { 84 | let mut talk = Talk::default(); 85 | let speaker1 = Speaker { 86 | id: 1, 87 | first_name: "First".to_string(), 88 | last_name: "Speaker".to_string(), 89 | company: Some("Acme Inc".to_string()) 90 | }; 91 | let speaker2 = Speaker { 92 | id: 2, 93 | first_name: "Second".to_string(), 94 | last_name: "Speaker".to_string(), 95 | company: Some("Acme Inc".to_string()) 96 | }; 97 | 98 | talk.speakers = Some(vec![speaker1, speaker2]); 99 | 100 | assert_eq!(talk.speaker_names(), "First Speaker, Second Speaker".to_string()); 101 | } 102 | } -------------------------------------------------------------------------------- /src/ui/app.rs: -------------------------------------------------------------------------------- 1 | use chrono::Weekday; 2 | use crate::devoxx::model::Talk; 3 | 4 | #[derive(PartialEq)] 5 | pub enum Mode { 6 | Normal, 7 | Filtered, 8 | Search 9 | } 10 | 11 | #[allow(dead_code)] 12 | pub struct App { 13 | pub day: Weekday, 14 | pub talks: Vec, 15 | pub selected: Option, 16 | pub search_text: String, 17 | pub mode: Mode, 18 | pub should_quit: bool, 19 | pub offline: bool 20 | } 21 | 22 | impl App { 23 | pub fn new(offline: bool) -> Result { 24 | // TODO 25 | let talks = vec![ 26 | Talk { 27 | talk_title: Some("TODO: load talks".into()), 28 | ..Talk::default() 29 | } 30 | ]; 31 | 32 | Ok(App { 33 | day : Weekday::Mon, 34 | talks, 35 | search_text: String::new(), 36 | selected: Some(0), 37 | mode : Mode::Normal, 38 | should_quit: false, 39 | offline 40 | }) 41 | } 42 | 43 | pub fn advance(&mut self) { 44 | //tick 45 | } 46 | 47 | pub fn get_selected(&self) -> Option<&Talk> { 48 | self.talks() 49 | .get(self.selected.unwrap_or_default()) 50 | .map(|x| *x) 51 | } 52 | 53 | pub fn talks(&self) -> Vec<&Talk> { 54 | self.talks 55 | .iter() 56 | // TODO 57 | .collect() 58 | } 59 | 60 | pub fn talk_titles(&self) -> Vec<&str> { 61 | self.talks() 62 | .iter() 63 | // TODO 64 | .map(|talk| talk.talk_title.as_ref().map_or("", String::as_str)) 65 | .collect() 66 | } 67 | 68 | // TODO a filter function for search talk titles 69 | 70 | pub fn next_tab(&mut self) -> Result<(), failure::Error> { 71 | let new_day = if self.day == Weekday::Fri { Weekday::Mon } else { self.day.succ() }; 72 | self.set_current_day(new_day) 73 | } 74 | 75 | pub fn previous_tab(&mut self) -> Result<(), failure::Error> { 76 | let new_day = if self.day == Weekday::Mon { Weekday::Fri } else { self.day.pred() }; 77 | self.set_current_day(new_day) 78 | } 79 | 80 | fn set_current_day(&mut self, day: Weekday) -> Result<(), failure::Error>{ 81 | self.day = day; 82 | // TODO reload the talks 83 | self.selected = Some(0); 84 | Ok(()) 85 | } 86 | 87 | pub fn next_talk(&mut self) { 88 | self.selected = if let Some(selected) = self.selected { 89 | if selected >= self.talks().len() - 1 { 90 | Some(0) 91 | } else { 92 | Some(selected + 1) 93 | } 94 | } else { 95 | Some(0) 96 | } 97 | } 98 | 99 | pub fn previous_talk(&mut self) { 100 | self.selected = if let Some(selected) = self.selected { 101 | if selected > 0 { 102 | Some(selected - 1) 103 | } else { 104 | Some(self.talks().len() - 1) 105 | } 106 | } else { 107 | Some(0) 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /src/ui/screen.rs: -------------------------------------------------------------------------------- 1 | use std::io; 2 | use std::io::Write; 3 | 4 | use termion::cursor::Goto; 5 | use termion::event::Key; 6 | use termion::input::MouseTerminal; 7 | use termion::raw::IntoRawMode; 8 | use termion::screen::AlternateScreen; 9 | use tui::backend::{TermionBackend, Backend}; 10 | use tui::layout::{Alignment, Constraint, Direction, Layout, Rect}; 11 | use tui::style::{Color, Modifier, Style}; 12 | use tui::{Terminal, Frame}; 13 | use tui::widgets::{Block, Borders, Paragraph, SelectableList, Tabs, Text, Widget}; 14 | 15 | use util::event::{Event, Events}; 16 | use crate::ui::app::Mode; 17 | 18 | use super::app::App; 19 | use super::util; 20 | use crate::Options; 21 | 22 | pub fn run(options: Options) -> Result<(), failure::Error> { 23 | // Terminal initialization 24 | let stdout = io::stdout().into_raw_mode()?; 25 | let stdout = MouseTerminal::from(stdout); 26 | let stdout = AlternateScreen::from(stdout); 27 | let backend = TermionBackend::new(stdout); 28 | let mut terminal = Terminal::new(backend)?; 29 | terminal.hide_cursor()?; 30 | 31 | let events = Events::new(); 32 | // App 33 | let mut app = App::new(options.offline)?; 34 | 35 | loop { 36 | draw(&mut terminal, &app)?; 37 | 38 | // stdout is buffered, flush it to see the effect immediately when hitting backspace. 39 | io::stdout().flush().ok(); 40 | 41 | handle_events(&events, &mut app)?; 42 | 43 | if app.should_quit { 44 | break; 45 | } 46 | } 47 | Ok(()) 48 | } 49 | 50 | fn handle_events(events: &Events, app: &mut App) -> Result<(), failure::Error> { 51 | match events.next()? { 52 | Event::Input(input) => match input { 53 | Key::Ctrl('c') | Key::Ctrl('d') => app.should_quit = true, 54 | Key::Char('\t') => app.next_tab()?, 55 | Key::Left => app.previous_tab()?, 56 | Key::Right => app.next_tab()?, 57 | Key::Down => app.next_talk(), 58 | Key::Up => app.previous_talk(), 59 | Key::Char('\n') if app.mode == Mode::Normal => { 60 | if let Some(selected) = app.selected { 61 | if let Some(_talk) = app.talks.get(selected) { 62 | // pressed enter on a talk 63 | } 64 | } 65 | } 66 | Key::Char('\n') if app.mode == Mode::Search => { 67 | app.mode = Mode::Filtered; 68 | } 69 | Key::Char('/') => { 70 | app.mode = Mode::Search; 71 | } 72 | Key::Esc => { 73 | app.search_text = "".to_string(); 74 | app.mode = Mode::Normal 75 | }, 76 | Key::Backspace if app.mode == Mode::Search => { 77 | app.search_text.pop(); 78 | app.selected = Some(0); 79 | } 80 | Key::Char(c) if app.mode == Mode::Search => { 81 | app.search_text.push(c); 82 | app.selected = Some(0); 83 | } 84 | _ => {} 85 | }, 86 | Event::Tick => { 87 | app.advance(); 88 | } 89 | } 90 | Ok(()) 91 | } 92 | 93 | fn draw(terminal: &mut Terminal, app: &App) -> Result<(), failure::Error> { 94 | terminal.draw(|mut f| { 95 | let chunks = Layout::default() 96 | .direction(Direction::Vertical) 97 | .constraints( 98 | [ 99 | Constraint::Length(8), // banner 100 | Constraint::Length(3), // tabs 101 | Constraint::Min(20), // main content 102 | Constraint::Length(1) // search bar 103 | ].as_ref() 104 | ) 105 | .split(f.size()); 106 | 107 | let (banner_panel, tab_panel, main_panel, search_panel) = 108 | (chunks[0], chunks[1], chunks[2], chunks[3]); 109 | 110 | draw_banner(&mut f, banner_panel); 111 | draw_tabs(&mut f, tab_panel, app); 112 | draw_search_bar(&mut f, search_panel, &app); 113 | draw_main_content(&mut f, main_panel, app); 114 | 115 | }).map_err(failure::Error::from)?; 116 | manage_cursor(terminal, app) 117 | } 118 | 119 | fn manage_cursor(terminal: &mut Terminal, app: &App) -> Result<(), failure::Error> 120 | where 121 | B: Backend + std::io::Write 122 | { 123 | if let Ok(rect) = terminal.size() { 124 | write!( 125 | terminal.backend_mut(), 126 | "{}", 127 | Goto((app.search_text.len() +2 ) as u16, rect.height as u16) 128 | )?; 129 | } 130 | 131 | if app.mode == Mode::Search { 132 | terminal.show_cursor()?; 133 | } else { 134 | terminal.hide_cursor()?; 135 | } 136 | Ok(()) 137 | } 138 | 139 | fn draw_banner(f: &mut Frame, area: Rect) 140 | where 141 | B: Backend 142 | { 143 | let banner = vec![ 144 | Text::raw(String::from(r#"________ _________ .__ .___ .__ "#) + "\n"), 145 | Text::raw(String::from(r#"\______ \ _______ _________ ______ ___ / _____/ ____ | |__ ____ __| _/_ __| | ____ "#) + "\n"), 146 | Text::raw(String::from(r#" | | \_/ __ \ \/ / _ \ \/ /\ \/ / \_____ \_/ ___\| | \_/ __ \ / __ | | \ | _/ __ \ "#) + "\n"), 147 | Text::raw(String::from(r#" | ` \ ___/\ ( <_> > < > < / \ \___| Y \ ___// /_/ | | / |_\ ___/ "#) + "\n"), 148 | Text::raw(String::from(r#"/_______ /\___ >\_/ \____/__/\_ \/__/\_ \ /_______ /\___ >___| /\___ >____ |____/|____/\___ >"#) + "\n"), 149 | Text::raw(String::from(r#" \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ "#) + "\n") 150 | ]; 151 | 152 | Paragraph::new(banner.iter()) 153 | .style(Style::default().fg(Color::White).bg(Color::Black)) 154 | .alignment(Alignment::Left) 155 | .style(Style::default().fg(Color::Cyan)) 156 | .wrap(false) 157 | .render(f, area); 158 | } 159 | 160 | fn draw_tabs(f: &mut Frame, area: Rect, app: &App) 161 | where 162 | B: Backend 163 | { 164 | Tabs::default() 165 | .block(Block::default().borders(Borders::ALL).title("Day")) 166 | .titles(&["Monday","Tuesday","Wednesday","Thursday", "Friday"]) 167 | .select(app.day.num_days_from_monday() as usize) 168 | .style(Style::default().fg(Color::Cyan)) 169 | .highlight_style(Style::default().fg(Color::Yellow)) 170 | .render(f, area); 171 | } 172 | 173 | fn draw_main_content(f: &mut Frame, area: Rect, app: &App) 174 | where 175 | B: Backend 176 | { 177 | let chunks = Layout::default() 178 | .direction(Direction::Horizontal) 179 | .constraints([ 180 | Constraint::Percentage(50), // master panel 181 | Constraint::Percentage(50) // detail panel 182 | ].as_ref()) 183 | .split(area); 184 | 185 | let (master, detail) = (chunks[0], chunks[1]); 186 | 187 | draw_master(f, master, app); 188 | draw_detail(f, detail, app); 189 | } 190 | 191 | fn draw_master(f: &mut Frame, area: Rect, app: &App) 192 | where 193 | B: Backend 194 | { 195 | let style = Style::default().fg(Color::White).bg(Color::Black); 196 | SelectableList::default() 197 | .block(Block::default().borders(Borders::ALL).title("Schedule")) 198 | .items(&app.talk_titles()) 199 | .select(app.selected) 200 | .style(style) 201 | .highlight_style(style.bg(Color::LightGreen).fg(Color::White).modifier(Modifier::BOLD)) 202 | .highlight_symbol(">") 203 | .render(f, area); 204 | } 205 | 206 | fn draw_detail(f: &mut Frame, area: Rect, app: &App) 207 | where 208 | B: Backend 209 | { 210 | let text = match app.get_selected() { 211 | // TODO 212 | _ => vec![Text::raw(String::from("TODO: Talk details"))] 213 | }; 214 | 215 | Paragraph::new(text.iter()) 216 | .block(Block::default().title("Details").borders(Borders::ALL)) 217 | .style(Style::default().fg(Color::White).bg(Color::Black)) 218 | .alignment(Alignment::Left) 219 | .wrap(true) 220 | .render(f, area); 221 | 222 | } 223 | 224 | fn draw_search_bar(f: &mut Frame, area: Rect, app: &App) 225 | where 226 | B: Backend 227 | { 228 | if app.mode == Mode::Search || app.mode == Mode::Filtered { 229 | Paragraph::new([Text::raw(format!("/{}", app.search_text))].iter()) 230 | .style(Style::default().fg(Color::Yellow)) 231 | .render(f, area); 232 | } 233 | } -------------------------------------------------------------------------------- /devoxx-data/friday.json: -------------------------------------------------------------------------------- 1 | [{"id":26853,"fromDate":"2019-11-08T07:30:00Z","toDate":"2019-11-08T08:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":1258,"sessionTypeName":"Breakfast","sessionTypeDuration":60,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26865,"fromDate":"2019-11-08T08:30:00Z","toDate":"2019-11-08T09:20:00Z","overflow":false,"reserved":true,"remark":"ForEach","roomId":1211,"roomName":"Room 4","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26868,"fromDate":"2019-11-08T08:30:00Z","toDate":"2019-11-08T09:20:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1153","trackName":"Big Data & Machine Learning","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png","speakers":[{"id":97101,"firstName":"Aayush","lastName":"Arora","company":"Roobits"}],"tags":[{"name":"Neural Networks"},{"name":"learning algorithms"},{"name":"Chrome"}],"talkDescription":"Chrome Dino or T-Rex game is an addiction when there is no Internet Connectivity. Automating it is more addictive as you see it improving itself in each iteration.\nThe possibilities with NeuralNet and Genetic Algorithms are endless.\nIn this session, you will learn how the principles of NeuralNet and Genetic Algorithms are used in Automating the Chrome Dino Game and the future scope of learning these concepts.","talkTitle":"Let the Dinosaur Play! Automating the Chrome Dinosaur Game ","talkId":104402},{"id":26864,"fromDate":"2019-11-08T08:30:00Z","toDate":"2019-11-08T09:20:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1207,"roomName":"Room 6","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1156","trackName":"Security","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/fab122c4-5e16-4e83-a3da-fad00870c886.png","speakers":[{"id":13551,"firstName":"Julien","lastName":"Topçu","company":"Societe Generale & OWASP Fundation"}],"tags":[{"name":"hack-session"},{"name":"AppSec"},{"name":"OWASP"}],"talkDescription":"Yet another leak of credit card numbers on the internet! https://www.infoq.com/news/2018/11/british-airways-data-breach\n\nIt is scary isn't it? But wait a minute! What are we doing to make sure our application is actually secured?\n\nDuring this live-coding and live-hacking session, discover the most common mistakes in software developement leading to security vulnerabilities, that the vast majority of us do without even knowing it!\n\nAfter that, you will not see your application in the same way ...","talkTitle":"How to get properly hacked!","talkId":13601},{"id":26869,"fromDate":"2019-11-08T08:30:00Z","toDate":"2019-11-08T09:20:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1151","trackName":"Methodology & Culture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png","speakers":[{"id":12452,"firstName":"Andrew","lastName":"Harmel-Law","company":"ThoughtWorks"}],"tags":[{"name":"changes"},{"name":"structure"},{"name":"culture"}],"talkDescription":"\nMarc Andreessen famously said “software is eating the world”; yet most of our teams and organisations simply aren’t set up for us to take part in this revolution. \n\nWhy? Our organisational surroundings are directly responsible for inefficient design and delivery – locally-optimised silos, opaque/ossified power structures, multi-layered middle management, command-and-control execs – the failings are well known. For us makers this is incredibly frustrating, when all we want to do is ship great product.\n\nIn this session I'm going to show how your software engineering skills make you ideally suited to fix these org and cultural problems. How do I know? Because I've done it myself, and want to tell you what I learned.\n\nI'll show you tried and tested ways to identify and fix these problems - fast-moving culture hacks, and safe org-refactorings - so you can drive effective incremental change from the bottom up; change that responds to the specifics of your organisation and focusses on efficient delivery of software; change that take its inspiration from the software techniques which we know so well. ","talkTitle":"Organisation Refactoring and Culture Hacking - Lessons from Software","talkId":12501},{"id":112004,"fromDate":"2019-11-08T08:30:00Z","toDate":"2019-11-08T09:20:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":108903,"firstName":"Maurizio","lastName":"Cimadamore","company":"Oracle"}],"tags":[{"name":"Java"},{"name":"Java APIs"},{"name":"Project Panama"},{"name":"Unsafe"},{"name":"memory access"}],"talkDescription":"Accessing foreign (e.g. off-heap) memory from a Java application can be useful for a number of reasons, from avoiding the costs associated with garbage collection, to sharing memory across multiple processes and/or with native code. Yet, to date, the Java SE API provides no official tools for accessing foreign memory, forcing developers to cope with less than ideal solutions. One such solution, perhaps the most widely used, is the ByteBuffer API, which allows the creation of so called \"direct\" byte buffers --- thus allowing users to manipulate off-heap memory directly from Java. Another, less common, avenue by which developer can access foreign memory from Java code is through the Unsafe API, which exposes several low-level functionalities to manipulate both off-heap and on-heap memory directly, and in a very efficient fashion, thanks to its clever use of JVM intrinsics. Unfortunately, existing approaches for accessing foreign memory are far from being ideal: on the one hand, the ByteBuffer API, which has been designed after I/O use cases, suffers from several limitations --- lack of addressing space, non-deterministic deallocation to name a few --- when used as a general purpose foreign memory API; on the other hand, using the Unsafe API -- as the name implies -- is a risky business, which can result in hard JVM crashes if the API is not used correctly. In other words, when it comes to accessing foreign memory, no optimal solution exists - and Java developers are faced with a dilemma: should they use the safe, trodded but twisted (and possibly less efficient) ByteBuffer path or should they abandon all safety guarantees and embrace the (unsupported) Unsafe API? In this talk we paint the path to the future: a safe, supported and efficient foreign memory access API for Java. By providing a more targeted solution to the problem of accessing foreign memory, not only developers will be freed by the limitations of the existing APIs - but they will also enjoy improved performances, as the new API will be designed from the ground-up with JIT optimizations in mind - and all without sacrificing memory access safety. ","talkTitle":"Beyond ByteBuffers","talkId":108954},{"id":27501,"fromDate":"2019-11-08T09:20:00Z","toDate":"2019-11-08T09:35:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":26902,"sessionTypeName":"Break","sessionTypeDuration":15,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":27404,"fromDate":"2019-11-08T09:35:00Z","toDate":"2019-11-08T10:25:00Z","overflow":false,"reserved":true,"remark":"bol.com","roomId":1211,"roomName":"Room 4","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":27405,"fromDate":"2019-11-08T09:35:00Z","toDate":"2019-11-08T10:25:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1153","trackName":"Big Data & Machine Learning","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png","speakers":[{"id":47801,"firstName":"Fiona","lastName":"Coath","company":"ThoughtWorks"}],"tags":[{"name":"rights"},{"name":"Machine learning"},{"name":"datasets"}],"talkDescription":"The adoption of Machine Learning in decision making has amplified the risk of socially-biased outcomes.Anyone (not just data scientists) working on ML tools holds immense power over shaping the future of our world. However, we can use this power for good and train models that help to drive positive social change sooner. This talk will provide context for this issue, explore real-world examples and discuss ideas for potential solutions.\n\nTogether let's discover:\n- How our datasets and algorithms share societies historical social biases.\n- Why this could cause results to be inaccurate and further exaggerate existing discrimination.\n- How we can assess the impact and change this from a risk into a powerful solution.","talkTitle":"Social Implications of Bias in Machine Learning","talkId":47652},{"id":27403,"fromDate":"2019-11-08T09:35:00Z","toDate":"2019-11-08T10:25:00Z","overflow":false,"reserved":true,"remark":"Cegeka","roomId":1207,"roomName":"Room 6","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":27401,"fromDate":"2019-11-08T09:35:00Z","toDate":"2019-11-08T10:25:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1151","trackName":"Methodology & Culture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png","speakers":[{"id":50836,"firstName":"Nicolas","lastName":"Helleringer","company":"Criteo"}],"tags":[{"name":"career"},{"name":"career opportunities"},{"name":"Management"}],"talkDescription":"As a technical person, in your carrer, you might have opportunities to become a team lead or a manager.\nIs this a good idea ?\nWhat are the expectations for this kind of positions ?\nWhat can be your expectation in taking such a job ?\nIs being technical/knowing how to code a true asset in this adventure ?\nOr one should put one's technical expertise on the shelf ?\nWhat are the special tips of doing technical teams and projects handling ? What is similar to other jobs ?\nI shall give you pointers and feedbacks about this kind of job positions and some ongoing reflexions.\nSharing of personal experience and other colleagues's I have coached on this path\nTheses experiences come from both the field and trenches but also from books and some inspiring people","talkTitle":"To be or not to be a manager in 2020","talkId":51721},{"id":112005,"fromDate":"2019-11-08T09:35:00Z","toDate":"2019-11-08T10:25:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1156","trackName":"Security","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/fab122c4-5e16-4e83-a3da-fad00870c886.png","speakers":[{"id":42651,"firstName":"Matt","lastName":"Raible","company":"Okta"},{"id":28502,"firstName":"Brian","lastName":"Vermeer","company":"Snyk"}],"tags":[{"name":"Spring Boot"},{"name":"Spring Security"},{"name":"Web development"}],"talkDescription":"Spring Boot is an excellent way to build Java applications with the Spring Framework. If you’re developing apps that handle sensitive data, you should make sure they’re secure. This session will cover HTTPS, dependency checking, CSRF, using a CSP to prevent XSS, OIDC, password hashing, and much more! You’ll learn how to add these features to a real application, using the Java language you know and love. ","talkTitle":"10 Excellent Ways to Secure Your Spring Boot Application","talkId":42701},{"id":109701,"fromDate":"2019-11-08T09:35:00Z","toDate":"2019-11-08T10:35:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1210,"roomName":"BOF 1","sessionTypeId":1252,"sessionTypeName":"BOF","sessionTypeDuration":60,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1158","trackName":"Mind the Geek","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/0bac192f-aa3c-4288-bad0-4dd4abdbbdc1.png","speakers":[{"id":21401,"firstName":"Emmanuel","lastName":"Bernard","company":"Red Hat"},{"id":45251,"firstName":"Arnaud","lastName":"Héritier","company":"CloudBees, Inc."},{"id":44102,"firstName":"Guillaume","lastName":"Laforge","company":"Google"},{"id":52002,"firstName":"Audrey","lastName":"Neveu","company":null}],"tags":[{"name":"methodology"},{"name":"life"},{"name":"Java"},{"name":"web"},{"name":"architecture"}],"talkDescription":"Les Cast Codeurs is a podcast made by | for | with developers. \nWe’re talking about Java of course, but also about architecture, methodology, security, tooling, web and even about culture and society. In short, about everything which is part of a developer's life. \nBut most of all, we’re speaking french. So if you do speak french, feel free to join us for a live recording! And if you don’t, well… feel free to join us too! It only depends on how much you appreciate french people disguised.","talkTitle":"Les Cast Codeurs Live","talkId":52057},{"id":27502,"fromDate":"2019-11-08T10:25:00Z","toDate":"2019-11-08T10:40:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":26902,"sessionTypeName":"Break","sessionTypeDuration":15,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":27507,"fromDate":"2019-11-08T10:40:00Z","toDate":"2019-11-08T11:30:00Z","overflow":false,"reserved":true,"remark":"DXC","roomId":1211,"roomName":"Room 4","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":27505,"fromDate":"2019-11-08T10:40:00Z","toDate":"2019-11-08T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"ADVANCED","langName":null,"timezone":"Europe/Brussels","trackId":"1153","trackName":"Big Data & Machine Learning","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png","speakers":[{"id":16352,"firstName":"Piotr","lastName":"Czajka","company":"TomTom"},{"id":16351,"firstName":"Łukasz","lastName":"Gebel","company":"TomTom"}],"tags":[{"name":"Neural Networks"},{"name":"Machine learning"},{"name":"Artificial Intelligence"},{"name":"Octave"}],"talkDescription":"Machine learning is one of the hottest buzzwords in technology today as well as one of the most innovative fields in computer science – yet people use libraries as black boxes without basic knowledge of the field. In this session, we will strip them to bare math, so next time you use a machine learning library, you'll have a deeper understanding of what lies underneath.\n\nDuring this session, we will first provide a short history of machine learning and an overview of two basic teaching techniques: supervised and unsupervised learning.\n\nWe will start by defining what machine learning is and equip you with an intuition of how it works. We will then explain gradient descent algorithm with the use of simple linear regression to give you an even deeper understanding of this learning method. Then we will project it to supervised neural networks training.\n\nWithin unsupervised learning, you will become familiar with Hebb’s learning and learning with concurrency (winner takes all and winner takes most algorithms). We will use Octave for examples in this session; however, you can use your favorite technology to implement presented ideas.\n\nOur aim is to show the mathematical basics of neural networks for those who want to start using machine learning in their day-to-day work or use it already but find it difficult to understand the underlying processes. After viewing our presentation, you should find it easier to select parameters for your networks and feel more confident in your selection of network type, as well as be encouraged to dive into more complex and powerful deep learning methods.","talkTitle":"Machine Learning: The Bare Math Behind Libraries","talkId":16451},{"id":27503,"fromDate":"2019-11-08T10:40:00Z","toDate":"2019-11-08T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1207,"roomName":"Room 6","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":50595,"firstName":"Andrei","lastName":"Pangin","company":"Odnoklassniki"}],"tags":[{"name":"Linux"},{"name":"memory leaks"},{"name":"profilers"},{"name":"JVM"},{"name":"memory footprint"}],"talkDescription":"Does JVM option '-Xmx4g' mean that the process will consume up to 4 GB RAM? Certainly not. What else can take virtual memory and how much of it? The question becomes especially important when running Java in a shared environment or in a container with limited resources.\n\nExcessive memory consumption may occur everywhere: from the application code and the libraries to the Java virtual machine and the operating system. While Java memory leaks are usually easy to discover from a heap dump, native memory leaks can be quite confusing.\n\nDuring this session we will discuss what structures contribute to the JVM footprint. We will study the real cases of native memory leaks and explore the tools useful in memory allocation analysis.","talkTitle":"Memory footprint of a Java process","talkId":51437},{"id":110660,"fromDate":"2019-11-08T10:40:00Z","toDate":"2019-11-08T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":109254,"firstName":"Brian","lastName":"Goetz","company":"Oracle"}],"tags":[{"name":"Java 12"},{"name":"Java 13"},{"name":"Java 14"}],"talkDescription":"Since last Devoxx, we've shipped Java 12 and 13, and Java 14 will be winding down in another month or so. What's changed in the language in the last year, and what's coming next? Join Java Language Architect Brian Goetz in a whirlwind tour of what’s happening in the Java language. ","talkTitle":"Java Language Futures: Late 2019 Edition","talkId":109303},{"id":110659,"fromDate":"2019-11-08T10:40:00Z","toDate":"2019-11-08T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1251,"sessionTypeName":"Conference","sessionTypeDuration":50,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1151","trackName":"Methodology & Culture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png","speakers":[{"id":15355,"firstName":"Bert Jan","lastName":"Schrijver","company":"OpenValue"}],"tags":[{"name":"DevOps"},{"name":"Continuous Delivery"},{"name":"Continuous Integration"}],"talkDescription":"The Wall Street Journal already mentioned it in 2011: “Software is eating the world.” Nowadays, every company is an IT company. Product owners and other business representatives seeing their competitors release new features to end users every day are demanding the same from their own software teams. How do you measure up to this heavy pressure as an IT organization? How do you quickly make changes to software systems in fast-paced environments without losing your grip on quality? How do you build and test software in such a way that it's always in a releasable state? This session explains the principles of Continuous Delivery and DevOps. You’ll leave this session with enough insights into how and where to get started yourself.","talkTitle":"Better software, faster: principles of Continuous Delivery and DevOps","talkId":15404},{"id":27508,"fromDate":"2019-11-08T11:30:00Z","toDate":"2019-11-08T12:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":1265,"sessionTypeName":"Safe travels home","sessionTypeDuration":60,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null}] -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "aho-corasick" 5 | version = "0.7.6" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 9 | ] 10 | 11 | [[package]] 12 | name = "ansi_term" 13 | version = "0.11.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | dependencies = [ 16 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 17 | ] 18 | 19 | [[package]] 20 | name = "atty" 21 | version = "0.2.13" 22 | source = "registry+https://github.com/rust-lang/crates.io-index" 23 | dependencies = [ 24 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 25 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 26 | ] 27 | 28 | [[package]] 29 | name = "autocfg" 30 | version = "0.1.6" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | 33 | [[package]] 34 | name = "backtrace" 35 | version = "0.3.40" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | dependencies = [ 38 | "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 39 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 40 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 41 | "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 42 | ] 43 | 44 | [[package]] 45 | name = "backtrace-sys" 46 | version = "0.1.32" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | dependencies = [ 49 | "cc 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", 50 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 51 | ] 52 | 53 | [[package]] 54 | name = "bitflags" 55 | version = "1.2.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | 58 | [[package]] 59 | name = "cassowary" 60 | version = "0.3.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | 63 | [[package]] 64 | name = "cc" 65 | version = "1.0.46" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | 68 | [[package]] 69 | name = "cfg-if" 70 | version = "0.1.10" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | 73 | [[package]] 74 | name = "chrono" 75 | version = "0.4.9" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | dependencies = [ 78 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 79 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 80 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 81 | "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", 82 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 83 | ] 84 | 85 | [[package]] 86 | name = "chrono-tz" 87 | version = "0.5.1" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | dependencies = [ 90 | "chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 91 | "parse-zoneinfo 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 92 | "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", 93 | ] 94 | 95 | [[package]] 96 | name = "clap" 97 | version = "2.33.0" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | dependencies = [ 100 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 101 | "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 102 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 103 | "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 104 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 105 | "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 106 | "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 107 | ] 108 | 109 | [[package]] 110 | name = "devoxx-schedule" 111 | version = "0.1.0" 112 | dependencies = [ 113 | "chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 114 | "chrono-tz 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 115 | "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 116 | "structopt 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 117 | "termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 118 | "tui 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 119 | ] 120 | 121 | [[package]] 122 | name = "either" 123 | version = "1.5.3" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | 126 | [[package]] 127 | name = "failure" 128 | version = "0.1.6" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | dependencies = [ 131 | "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", 132 | "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 133 | ] 134 | 135 | [[package]] 136 | name = "failure_derive" 137 | version = "0.1.6" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | dependencies = [ 140 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 141 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 142 | "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 143 | "synstructure 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", 144 | ] 145 | 146 | [[package]] 147 | name = "heck" 148 | version = "0.3.1" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | dependencies = [ 151 | "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 152 | ] 153 | 154 | [[package]] 155 | name = "itertools" 156 | version = "0.8.0" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | dependencies = [ 159 | "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 160 | ] 161 | 162 | [[package]] 163 | name = "lazy_static" 164 | version = "1.4.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | 167 | [[package]] 168 | name = "libc" 169 | version = "0.2.65" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | 172 | [[package]] 173 | name = "log" 174 | version = "0.4.8" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | dependencies = [ 177 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 178 | ] 179 | 180 | [[package]] 181 | name = "memchr" 182 | version = "2.2.1" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | 185 | [[package]] 186 | name = "num-integer" 187 | version = "0.1.41" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | dependencies = [ 190 | "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 191 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 192 | ] 193 | 194 | [[package]] 195 | name = "num-traits" 196 | version = "0.2.8" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | dependencies = [ 199 | "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 200 | ] 201 | 202 | [[package]] 203 | name = "numtoa" 204 | version = "0.1.0" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | 207 | [[package]] 208 | name = "parse-zoneinfo" 209 | version = "0.2.0" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | dependencies = [ 212 | "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 213 | ] 214 | 215 | [[package]] 216 | name = "proc-macro-error" 217 | version = "0.2.6" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | dependencies = [ 220 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 221 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 222 | "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 223 | ] 224 | 225 | [[package]] 226 | name = "proc-macro2" 227 | version = "1.0.6" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | dependencies = [ 230 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 231 | ] 232 | 233 | [[package]] 234 | name = "quote" 235 | version = "1.0.2" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | dependencies = [ 238 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 239 | ] 240 | 241 | [[package]] 242 | name = "redox_syscall" 243 | version = "0.1.56" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | 246 | [[package]] 247 | name = "redox_termios" 248 | version = "0.1.1" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | dependencies = [ 251 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 252 | ] 253 | 254 | [[package]] 255 | name = "regex" 256 | version = "1.3.1" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | dependencies = [ 259 | "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", 260 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 261 | "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 262 | "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 263 | ] 264 | 265 | [[package]] 266 | name = "regex-syntax" 267 | version = "0.6.12" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | 270 | [[package]] 271 | name = "rustc-demangle" 272 | version = "0.1.16" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | 275 | [[package]] 276 | name = "serde" 277 | version = "1.0.101" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | 280 | [[package]] 281 | name = "strsim" 282 | version = "0.8.0" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | 285 | [[package]] 286 | name = "structopt" 287 | version = "0.3.3" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | dependencies = [ 290 | "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", 291 | "structopt-derive 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 292 | ] 293 | 294 | [[package]] 295 | name = "structopt-derive" 296 | version = "0.3.3" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | dependencies = [ 299 | "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 300 | "proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 301 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 302 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 303 | "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 304 | ] 305 | 306 | [[package]] 307 | name = "syn" 308 | version = "1.0.5" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | dependencies = [ 311 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 312 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 313 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 314 | ] 315 | 316 | [[package]] 317 | name = "synstructure" 318 | version = "0.12.1" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | dependencies = [ 321 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 322 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 323 | "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 324 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 325 | ] 326 | 327 | [[package]] 328 | name = "termion" 329 | version = "1.5.3" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | dependencies = [ 332 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 333 | "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 334 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 335 | "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 336 | ] 337 | 338 | [[package]] 339 | name = "textwrap" 340 | version = "0.11.0" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | dependencies = [ 343 | "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 344 | ] 345 | 346 | [[package]] 347 | name = "thread_local" 348 | version = "0.3.6" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | dependencies = [ 351 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 352 | ] 353 | 354 | [[package]] 355 | name = "time" 356 | version = "0.1.42" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | dependencies = [ 359 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 360 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 361 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 362 | ] 363 | 364 | [[package]] 365 | name = "tui" 366 | version = "0.6.2" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | dependencies = [ 369 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 370 | "cassowary 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 371 | "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 372 | "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 373 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 374 | "termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 375 | "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 376 | "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 377 | ] 378 | 379 | [[package]] 380 | name = "unicode-segmentation" 381 | version = "1.3.0" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | 384 | [[package]] 385 | name = "unicode-width" 386 | version = "0.1.6" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | 389 | [[package]] 390 | name = "unicode-xid" 391 | version = "0.2.0" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | 394 | [[package]] 395 | name = "vec_map" 396 | version = "0.8.1" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | 399 | [[package]] 400 | name = "winapi" 401 | version = "0.3.8" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | dependencies = [ 404 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 405 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 406 | ] 407 | 408 | [[package]] 409 | name = "winapi-i686-pc-windows-gnu" 410 | version = "0.4.0" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | 413 | [[package]] 414 | name = "winapi-x86_64-pc-windows-gnu" 415 | version = "0.4.0" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | 418 | [metadata] 419 | "checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" 420 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 421 | "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" 422 | "checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875" 423 | "checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" 424 | "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" 425 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 426 | "checksum cassowary 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" 427 | "checksum cc 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)" = "0213d356d3c4ea2c18c40b037c3be23cd639825c18f25ee670ac7813beeef99c" 428 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 429 | "checksum chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e8493056968583b0193c1bb04d6f7684586f3726992d6c573261941a895dbd68" 430 | "checksum chrono-tz 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e0e430fad0384e4defc3dc6b1223d1b886087a8bf9b7080e5ae027f73851ea15" 431 | "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" 432 | "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" 433 | "checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" 434 | "checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" 435 | "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 436 | "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" 437 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 438 | "checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" 439 | "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" 440 | "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" 441 | "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" 442 | "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" 443 | "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" 444 | "checksum parse-zoneinfo 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "089a398ccdcdd77b8c38909d5a1e4b67da1bc4c9dbfe6d5b536c828eddb779e5" 445 | "checksum proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aeccfe4d5d8ea175d5f0e4a2ad0637e0f4121d63bd99d356fb1f39ab2e7c6097" 446 | "checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" 447 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 448 | "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 449 | "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" 450 | "checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" 451 | "checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" 452 | "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" 453 | "checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd" 454 | "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 455 | "checksum structopt 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4f66a4c0ddf7aee4677995697366de0749b0139057342eccbb609b12d0affc" 456 | "checksum structopt-derive 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8fe0c13e476b4e21ff7f5c4ace3818b6d7bdc16897c31c73862471bc1663acae" 457 | "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" 458 | "checksum synstructure 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f085a5855930c0441ca1288cf044ea4aecf4f43a91668abdb870b4ba546a203" 459 | "checksum termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a8fb22f7cde82c8220e5aeacb3258ed7ce996142c77cba193f203515e26c330" 460 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 461 | "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" 462 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 463 | "checksum tui 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "73b422ff4986065d33272b587907654f918a3fe8702786a8110bf68dede0d8ee" 464 | "checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" 465 | "checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20" 466 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 467 | "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" 468 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 469 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 470 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 471 | -------------------------------------------------------------------------------- /devoxx-data/tuesday.json: -------------------------------------------------------------------------------- 1 | [{"id":26702,"fromDate":"2019-11-05T07:30:00Z","toDate":"2019-11-05T08:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":1258,"sessionTypeName":"Breakfast","sessionTypeDuration":60,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":111752,"fromDate":"2019-11-05T08:30:00Z","toDate":"2019-11-05T11:30:00Z","overflow":true,"reserved":false,"remark":null,"roomId":1211,"roomName":"Room 4","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26553,"fromDate":"2019-11-05T08:30:00Z","toDate":"2019-11-05T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"INTERMEDIATE","langName":null,"timezone":"Europe/Brussels","trackId":"1160","trackName":"Architecture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png","speakers":[{"id":25751,"firstName":"Josh","lastName":"Long","company":"Pivotal"}],"tags":[{"name":"MicroServices"},{"name":"Spring Boot"},{"name":"Reactive Programming"},{"name":"Reactive Streams"}],"talkDescription":"Microservices and big-data increasingly confront us with the limitations of traditional input/output. In traditional IO, work that is IO-bound dominates threads. This wouldn't be such a big deal if we could add more threads cheaply, but threads are expensive on the JVM, and most other platforms. Even if threads were cheap and infinitely scalable, we'd still be confronted with the faulty nature of networks. Things break, and they often do so in subtle, but non-exceptional ways. Traditional approaches to integration bury the faulty nature of networks behind overly simplifying abstractions. We need something better.\n\nSpring Framework 5 introduced the Spring developer to a growing world of support for reactive programming across the Spring portfolio, starting with a new Netty-based web runtime, component model and module called Spring WebFlux, and then continuing to Spring Data Kay, Spring Security 5.0, Spring Boot 2.0 and Spring Cloud Finchley. Sure, it sounds like a lot, but don't worry! Join me, your guide, Spring developer advocate Josh Long, and we'll begin the reactive revolution together.","talkTitle":"Reactive Revolution","talkId":25802},{"id":26568,"fromDate":"2019-11-05T08:30:00Z","toDate":"2019-11-05T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1207,"roomName":"Room 6","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"ADVANCED","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":52605,"firstName":"José","lastName":"Paumard","company":"Independant (very)"}],"tags":[{"name":"Java SE"},{"name":"Java"},{"name":"future"}],"talkDescription":"As it was announced, Java keeps releasing a major version every 6 months. The release train passes and brings its amount of new things. Some of the expected functionalities have already been released: a new syntax for the switch clause or a new bytecode instruction: CONSTANT_DYNAMIC. Other are still work in progress: a new way to write methods, a smart instanceof, lazy evaluated constants. Projects are progressing too. Loom will bring new concurrent programming paradigms. Amber is about to bring data types and new lanaguage constructs. Valhalla can already show very promising results with formerly called value types, now called inline types. It is hard to tell when all these things are released, but when they are ready, we will have them in less than 6 months! We will give details about all this, with code and live demos of preview versions. \n","talkTitle":"Java keeps throttling up!","talkId":54101},{"id":26563,"fromDate":"2019-11-05T08:30:00Z","toDate":"2019-11-05T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1160","trackName":"Architecture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png","speakers":[{"id":106952,"firstName":"Andrew","lastName":"Dunnings","company":"IBM"},{"id":50574,"firstName":"Katherine","lastName":"Stanley","company":"IBM UK"}],"tags":[{"name":"Apache Kafka"},{"name":"Kafka"},{"name":"Apache Kafka Streams"}],"talkDescription":"This session dives deep into the architecture of Apache Kafka and how to use it in practice. Kafka offers a new take on publish/subscribe messaging that is very different from other messaging systems. But Kafka isn't just a messaging system - it's an event streaming platform. Become an expert on Kafka concepts such as topic partitioning, consumer groups and exactly-once semantics. Find out best practices for using the APIs to achieve performance and reliability. Learn about advanced concepts such as stream processing using the Kafka Streams and integrating with other services using Kafka Connect.","talkTitle":"A Deep Dive into Apache Kafka - This is Event-Streaming, Not Just Messaging","talkId":51736},{"id":26565,"fromDate":"2019-11-05T08:30:00Z","toDate":"2019-11-05T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":99501,"firstName":"Venkat","lastName":"Subramaniam","company":"Agile Developer, Inc."}],"tags":[{"name":"Java"},{"name":"Collection Framework"},{"name":"Collections features"}],"talkDescription":"One of the most intriguing classes in the JDK is the Collectors utility class, with a collection of some highly powerful functions that are useful during the reduce operation of streams. The functions that are in this class have so much to offer and yet, due to their complex nature, often are not used as much as they should be. Using well defined live coded examples, we will take up several common programming problems. Discuss them quickly and drive the implementation of these using the Collectors methods. By the end of this presentation you will know more throughly the power of Collectors and how to apply the methods in there.","talkTitle":"Exploring Collectors","talkId":100001},{"id":26891,"fromDate":"2019-11-05T08:30:00Z","toDate":"2019-11-05T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1210,"roomName":"BOF 1","sessionTypeId":1262,"sessionTypeName":"Hands-on Lab","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1159","trackName":"Cloud, Containers & Infrastructure","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png","speakers":[{"id":49064,"firstName":"Ray","lastName":"Tsang","company":"Google"},{"id":45702,"firstName":"Mete","lastName":"Atamel","company":"Google"},{"id":49509,"firstName":"James","lastName":"Ward","company":"Google"}],"tags":[{"name":"Kubernetes"},{"name":"serverless"},{"name":"kNative"}],"talkDescription":"Over the past several years Google has open sourced several cloud-native technologies abstracting away more and more underlying infrastructure into well-defined processes that can work across different environments. Kubernetes and Istio provide cluster primitives for scheduling and networking. Knative is a serverless platform built on Kubernetes and Istio and higher-level deployment, serving, and eventing. In this workshop you will get hands-on with Knative, using the build, serving, and eventing pieces. You will learn the different features of Knative by using them via Spring Boot applications & functions.","talkTitle":"Knative Workshop - Your own Platform as a Service on Kubernetes","talkId":49310},{"id":26890,"fromDate":"2019-11-05T08:30:00Z","toDate":"2019-11-05T11:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1206,"roomName":"BOF 2","sessionTypeId":1262,"sessionTypeName":"Hands-on Lab","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1153","trackName":"Big Data & Machine Learning","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png","speakers":[{"id":30001,"firstName":"Nick","lastName":"Bourdakos","company":"IBM"}],"tags":[{"name":"Deep Learning"},{"name":"Computer Vision"},{"name":"TensorFlow"}],"talkDescription":"Whether you are counting cars on a road or people stranded on rooftops in a natural disaster, there are plenty of use cases for object detection. Often times, pre-trained object detection models do not suit our needs and we need to create our own custom models.\n\nHow can we utilize machine learning to train our own custom model without substantive computing power and time?\nAnswer: Watson Machine Learning.\n\nHow can we leverage our custom trained model to detect object’s, in real-time, with complete user privacy, all in the browser?\nAnswer: TensorFlow.js.\n\nIn this workshop, you will create a web app that does just that. You will learn how to create an IBM Cloud Object Storage instance to store your labeled data. Once your data is ready, you will learn how to spin up a Watson Machine Learning instance to train your own custom model on top-of-the-line GPUs. After your model has completed training, you can simply plug the TensorFlow.js model into your react application.\n\nAt the end of this workshop, you should understand how to:\n- Label data that can be used for object detection\n- Use your custom data to train a model using Watson Machine Learning\n- Detect objects with TensorFlow.js in the browser","talkTitle":"Realtime Object Detection in the Browser with Tensorflow.js","talkId":33202},{"id":26704,"fromDate":"2019-11-05T11:30:00Z","toDate":"2019-11-05T12:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":26751,"sessionTypeName":"Lunch","sessionTypeDuration":60,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26562,"fromDate":"2019-11-05T12:30:00Z","toDate":"2019-11-05T15:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1211,"roomName":"Room 4","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1151","trackName":"Methodology & Culture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png","speakers":[{"id":49055,"firstName":"Victor","lastName":"Rentea","company":"Independent + IBM"}],"tags":[{"name":"coding practices"},{"name":"refactoring"},{"name":"refactoring techniques"},{"name":"livecoding session"}],"talkDescription":"Would you attach your last commit to your CV: \"Sample: how I write code\"? What do others think of your code? Writing Clean Code: an old topic, but never less important, nor challenging than today!\nDuring the first part of this deep-dive session, we will go through the essential clean code rules, learning to detect code smells, discussing refactoring ideas and alternative designs pros/cons. Then, after the break, we will apply what we learned in a refactoring live-coding kata, explaining 10 key practical techniques you can immediately apply in your code. \nBy the end of the session, you will have a clear picture of what clean code means and quite a variety of ways at hand to get there. Along the way, we will also point out the differences between procedural/oop/functional paradigms and whether they are competing or complementary, speak in detail about Extract Method, statefulness, separation by layers of abstractions, OOP, and many more.\n\nCan't wait to share my greatest passion with you: writing professional, expressive code that is a pleasure to work with.\n","talkTitle":"Clean Code - The Next Chapter","talkId":49108},{"id":26570,"fromDate":"2019-11-05T12:30:00Z","toDate":"2019-11-05T15:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":99501,"firstName":"Venkat","lastName":"Subramaniam","company":"Agile Developer, Inc."}],"tags":[{"name":"Java 10"},{"name":"Java9"},{"name":"Java 11"}],"talkDescription":"Java is evolving at a rapid pace. While Java 8 introduced the most significant change to the JDK and the language, each release of Java since then has added some distinctive features both to the core language and the JDK. In this session we will dive into the significant changes to Java from Java 9 to the latest version. We will take an example oriented approach to look into the features, discuss the pros and cons of using them.","talkTitle":"Java 9 and Beyond","talkId":99851},{"id":116102,"fromDate":"2019-11-05T12:30:00Z","toDate":"2019-11-05T15:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1207,"roomName":"Room 6","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1152","trackName":"Programming languages","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/53f80769-d8be-4ae5-a731-d5591c97d2b4.png","speakers":[{"id":24904,"firstName":"Sébastien","lastName":"Deleuze","company":"Pivotal"}],"tags":[{"name":"coroutines"},{"name":"Spring Boot"},{"name":"Spring Framework 5"},{"name":"Reactive Programming"},{"name":"Kotlin"}],"talkDescription":"In this deepdive session, we are going to explore how to leverage Spring Reactive stack with imperative code thanks to Kotlin Coroutines and its new Flow type. We are going to build step by step a chat application with Spring Boot 2.2 in order to explore various use cases for Coroutines API:\n - Building a REST API with WebFlux\n - Rendering of templates with Thymeleaf\n - Reactive messaging with RSocket including Android and JavaScript clients\n - Requesting remote webservices including streaming one with WebClient\n - Persistence with Spring Data R2DBC (Reactive SQL)\n\nAt the end of this session, you will have a good understanding of what structured concurrency is, what makes Kotlin Flow so attractive, what are the differences between regular blocking code and Reactive code written with Coroutines, and what level of performance and scalability you can expect with this new way to consume Spring Reactive stack.","talkTitle":"Deepdive into Reactive Spring with Coroutines and Kotlin Flow","talkId":40958},{"id":26566,"fromDate":"2019-11-05T12:30:00Z","toDate":"2019-11-05T15:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1159","trackName":"Cloud, Containers & Infrastructure","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png","speakers":[{"id":39201,"firstName":"David","lastName":"Gageot","company":"Google"}],"tags":[{"name":"Kubernetes"},{"name":"Development Tools"},{"name":"Containers"}],"talkDescription":"Do you know a 10x developer? Not sure they really exist.\nHowever, it's clear that good tools help go from an idea to production much quicker.\n\nWe'll see how tools inspired by Google's internal tooling can help you develop and deploy\nto Kubernetes \"like a Googler\".\n\nCloud Code, Skaffold and Jib give you a tight feedback loop and enable continuous deployment.\nKind and Skaffold help you run integration tests on your CI/CD.\nGoogle Cloud Run and Knative help you get started without the complexity of Kubernetes while\noffering a nice migration path.","talkTitle":"Develop and Deploy to Kubernetes like a Googler","talkId":39251},{"id":26567,"fromDate":"2019-11-05T12:30:00Z","toDate":"2019-11-05T15:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1256,"sessionTypeName":"Deep Dive","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"INTERMEDIATE","langName":null,"timezone":"Europe/Brussels","trackId":"1155","trackName":"Server Side Java","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/698b503d-9578-48da-85a9-bdf8ba942e3a.png","speakers":[{"id":16853,"firstName":"Michael","lastName":"Simons","company":"Neo4j, Inc."},{"id":14704,"firstName":"Mark","lastName":"Paluch","company":"Pivotal"}],"tags":[{"name":"Reactive Programming"},{"name":"Reactive Streams"},{"name":"transactions"}],"talkDescription":"How are reactive transactions supposed to work in a non-blocking, reactive application?\n\nSpring draws with its reactive transaction manager a new, strong primitive in the picture of reactive systems. We will deeply dive into Reactive Relational Database Connectivity, the reactive specification for SQL database access and into Neo4j 4 that comes with a reactive database client.\n\nWe will walk through the access of strictly transactional data sources while embracing reactive and non-blocking properties.\nThis highly technical Deep Dive session will visit reactive patterns for potentially highly concurrent applications that are no longer opinionated about threading.\n\nCome to this session and learn how to set up and use transactions in a reactive application. We will present R2DBC and Neo4j examples and are open for questions, comments, and discussion. Bring your laptop set up with Java 8 or newer and your favorite IDE, and be prepared to think!\n","talkTitle":"Reactive Transactions Masterclass","talkId":16952},{"id":26893,"fromDate":"2019-11-05T12:30:00Z","toDate":"2019-11-05T15:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1210,"roomName":"BOF 1","sessionTypeId":1262,"sessionTypeName":"Hands-on Lab","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1160","trackName":"Architecture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png","speakers":[{"id":16152,"firstName":"Vladimir","lastName":"Dejanovic","company":"PVH"},{"id":16157,"firstName":"Thomas","lastName":"Segismont","company":"Red Hat"}],"tags":[{"name":"microservices architectures"},{"name":"GraphQL"},{"name":"API gateway"}],"talkDescription":"The API Gateway pattern is a well-known solution to the problem of clients communicating with a microservices-based application. It relieves browsers or mobile devices from sending several requests to display a single web page or screen.\n\nIn practice, the pattern is often implemented as an HTTP/JSON service. Therefore it is difficult for the web, mobile and backend developers to settle on a payload format that is both flexible and concise to suit all the different kinds of frontends.\n\nGraphQL is a query and schema definition language for your backend services. It can be used over different transports (e. g. HTTP, Websocket) and provides frontend developers with the ability to request exactly the information they need, making it a great solution to implement the API Gateway pattern.\n\nThis workshop starts with a brief introduction to GraphQL. Then you will build a gateway for a music store microservices-based application. You will learn how to fetch data from HTTP services or a Postgres database and protect users with authentication. We will focus on the use case instead of the GraphQL technology itself (there are plenty of resources for that on the web).\n\nSoftware requirements:\n\n- JDK8 or JDK11\n- Recent version of Maven\n- Recent version of Postgres database (or Docker)\n- Java IDE","talkTitle":"Implementing the API Gateway pattern with GraphQL","talkId":16407},{"id":26892,"fromDate":"2019-11-05T12:30:00Z","toDate":"2019-11-05T15:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1206,"roomName":"BOF 2","sessionTypeId":1262,"sessionTypeName":"Hands-on Lab","sessionTypeDuration":180,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1153","trackName":"Big Data & Machine Learning","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png","speakers":[{"id":49062,"firstName":"Ivar","lastName":"Reukers","company":"Ordina"},{"id":49059,"firstName":"Remco","lastName":"Runge","company":"Ordina"}],"tags":[{"name":"Deep Learning"},{"name":"Machine learning"},{"name":"Artificial Intelligence"},{"name":"Computer Vision"},{"name":"DL4J"}],"talkDescription":"The Duke is well known in the Java universe. You might even have seen him flash by, Of course you would love to have a picture of the Duke, but he is rather shy. Even before the photographer can say ‘SMILE’, the Duke is already gone. We would like to help you to change this. \nWithin this HOL you will be using DL4J (Deep Learning 4 Java) to train a neural network into recognising the Duke. By using Transfer Learning, we will make sure that you can train your network within minutes. You will get a first experience in building neural networks, how you can train them and how you can improve your network. \nTo help you test your setup, all participants will be given a custom made a stuffed Duke figure. With the help of this figure you can make sure that you will be able to get a picture of the Duke the next time he flashes by. Off course you can take the Duke home to keep improving your software.\nAfter this HOL you will have learned how to use Java in combination with DL4J to build and train a deep learning network. You will be able to create your own trainings data and retrain the network to recognize anything you want. \nFor this HOL you do not need any experience with Deep Learning. Basic programming knowledge should suffice. \n","talkTitle":"Finding the Duke with DL4J (DeepLearning 4 Java)","talkId":49113},{"id":26952,"fromDate":"2019-11-05T15:30:00Z","toDate":"2019-11-05T15:45:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":26902,"sessionTypeName":"Break","sessionTypeDuration":15,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26593,"fromDate":"2019-11-05T15:45:00Z","toDate":"2019-11-05T16:15:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1211,"roomName":"Room 4","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1151","trackName":"Methodology & Culture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png","speakers":[{"id":18653,"firstName":"Stijn","lastName":"Vanpoucke","company":"Freelance"}],"tags":[{"name":"skills"},{"name":"learning"},{"name":"Tools"}],"talkDescription":"Due the extreme amount of resources we're getting overwhelmed with blogs, articles, youtube channels, online courses, books, etc... After this conference you'll definitely have multiple topics you want to learn more about. But distractions, information overload, work priorities and others are not helpful towards focused learning. Maybe your HR department enforces you to do a yearly reflection on what you've learned, and you'll definitely have stuff to tell, but most likely there will also be topics that you where not able to dive in to as much as you wanted. \n\nDuring the years I've combined different proven techniques like OKR's and GROW. But I always struggled to keep track of them on a daily/weekly basis. I'm not an HR guy I'm technical and I love tools. So I'm using tools to motivate myself and to get my focus back, I'm using notion, pocket, IFTTT, Kanban boards and mind mappings, etc.. Some I failed to keep in my daily routine but others where surprisingly useful. Those are the ones I want to share with you so that you can started using them and become an even more better developer in no-time. These tools will become your personal coach. They'll help you to reason about your goals as a developer, they will help you to organise all the gathered information, they will enforce you to work on your skills on a short- and long-term basis, and they'll make sure that you spend your time more wisely. I wished that I knew about them many years ago.","talkTitle":"Productivity tools you should know about if you want to have a focused learning path","talkId":19704},{"id":26592,"fromDate":"2019-11-05T15:45:00Z","toDate":"2019-11-05T16:15:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1156","trackName":"Security","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/fab122c4-5e16-4e83-a3da-fad00870c886.png","speakers":[{"id":50835,"firstName":"Sebastien","lastName":"Blanc","company":"Red Hat"}],"tags":[{"name":"identity"},{"name":"Quarkus"},{"name":"security"}],"talkDescription":"So you have built in no time your Quarkus application and it's supersonic subatomic fast but have you thought about security ? Right, usually this is the thing we implement at the end even if it's a crucial part of our application we often ignore it . The good news it's that with Quarkus, adding security and identity management is a breeze.\nJoin me in this 100% live coding session where we explore the different options that Quarkus offers you to secure your applications.","talkTitle":"Secure your Quarkus Applications","talkId":51717},{"id":26591,"fromDate":"2019-11-05T15:45:00Z","toDate":"2019-11-05T16:15:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1207,"roomName":"Room 6","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":41602,"firstName":"Kevin","lastName":"Rushforth","company":"Oracle"}],"tags":[{"name":"installers"},{"name":"OpenJDK"},{"name":"Development Tools"}],"talkDescription":"In JDK 14 we plan to deliver a new tool, jpackage, that will enable application developers to distribute their applications in an installable package suitable for the native platform on which it will run. Supported platforms and package formats include .exe and .msi for Windows, .dmg for macOS, and .rpm and .deb for Linux. Learn how jpackage works in conjunction with jlink to deliver a standalone application with the set of JDK modules required to run that application. We will explain how to use jpackage and give plenty of examples you can use for your application deployment needs.","talkTitle":"Java Packaging Tool: Create Native Packages to Deploy Java Applications","talkId":105501},{"id":26594,"fromDate":"2019-11-05T15:45:00Z","toDate":"2019-11-05T16:15:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1159","trackName":"Cloud, Containers & Infrastructure","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png","speakers":[{"id":45702,"firstName":"Mete","lastName":"Atamel","company":"Google"}],"tags":[{"name":"Kubernetes"},{"name":"serverless"},{"name":"Containers"},{"name":"kNative"}],"talkDescription":"The “serverless” buzzword was popularized thanks to FaaS platforms (Function-as-a-Service). However, serverless goes beyond just functions. Even traditional Platform-as-a-Service solutions also exhibit serverless characteristics (managed infrastructure, auto-scaling capabilities, pay for usage), when they’re letting developers push their apps as the unit of deployment. \n\nSimilarly, a container is just another way to package your business logic. And that’s what Google Cloud Run is all about: you package your code in a container. You decide to use any language, runtime or library, as long as it runs in a container that can receive incoming HTTP requests. \n\nCloud Run is a fully-managed product that scales your container images from 0 to n depending on traffic, and you pay proportionally to that usage. It can also run in Google’s managed Kubernetes clusters (GKE) giving you more control on the machines running your workloads. \n\nLast but not least, you’re not tied to the Google Cloud Platform at all, as Cloud Run builds atop the Knative serverless building blocks for Kubernetes. You can also deploy and scale your containers on other cloud providers or on-premises, thanks to the openness and portability brought by Knative. \n\nAfter an overview of Cloud Run, its developer experience, we’ll go through various demos to watch your serverless containers in action!","talkTitle":"Cloud Run, serverless containers in action","talkId":44163},{"id":26590,"fromDate":"2019-11-05T15:45:00Z","toDate":"2019-11-05T16:15:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1155","trackName":"Server Side Java","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/698b503d-9578-48da-85a9-bdf8ba942e3a.png","speakers":[{"id":44101,"firstName":"Jean","lastName":"Bisutti","company":"Zenika"}],"tags":[{"name":"Spring Boot"},{"name":"Hibernate"},{"name":"Performance Issues"}],"talkDescription":"Let's suppose that you are developing a new application: How to quickly detect big performance bottlenecks? \n\nHow to easily know whether the new written code is raising many SQL requests? \n\nHow to easily spot that your application might consume a lot of memory?\n\nIn this Tools-in-Action, we will show how QuickPerf (https://github.com/quick-perf/quickperf) can help us to quickly detect some big performance bottlenecks and remove them as soon as possible.","talkTitle":"Quickly remove some big performance bottlenecks with QuickPerf","talkId":44151},{"id":26954,"fromDate":"2019-11-05T16:15:00Z","toDate":"2019-11-05T16:30:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":26902,"sessionTypeName":"Break","sessionTypeDuration":15,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26596,"fromDate":"2019-11-05T16:30:00Z","toDate":"2019-11-05T17:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1211,"roomName":"Room 4","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1151","trackName":"Methodology & Culture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png","speakers":[{"id":24901,"firstName":"Andres","lastName":"Almiray","company":"Oracle"}],"tags":[{"name":"Gradle"},{"name":"build systems"},{"name":"Apache Maven"}],"talkDescription":"The Gradle Build Tool is quite powerful and flexible, perhaps too flexible if you ask around. Every where you turn you encounter custom builds with different conventions and arrangements. If only there was a way to follow a structure than ensures top-down constraints in a build. Well it turns out it's possible! Come learn how you and your organization can leverage the powerful features found in the Gradle Build Tool while at the same time reducing clutter and head-scratching moments.","talkTitle":"Gradle Ex Machina","talkId":45904},{"id":26598,"fromDate":"2019-11-05T16:30:00Z","toDate":"2019-11-05T17:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1156","trackName":"Security","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/fab122c4-5e16-4e83-a3da-fad00870c886.png","speakers":[{"id":45701,"firstName":"Julien","lastName":"Garcia Gonzalez","company":"Giant Swarm"}],"tags":[{"name":"OSS"},{"name":"Kubernetes"},{"name":"security"}],"talkDescription":"Kubernetes is like an onion. Many layers. Each layer brings its own set of vulnerabilities; learning how to mitigate them is important. During this presentation you will learn how to analyze, scan, and fix your vulnerabilities, starting from the infrastructure and moving all the way up to the application runtime.","talkTitle":"A secure journey on Kubernetes","talkId":45452},{"id":26599,"fromDate":"2019-11-05T16:30:00Z","toDate":"2019-11-05T17:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1207,"roomName":"Room 6","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":106401,"firstName":"Yishai","lastName":"Galatzer","company":"Amazon Web Services"}],"tags":[{"name":"JDK"},{"name":"OpenJDK"},{"name":"Corretto"}],"talkDescription":"In this session we will explore the journey of migrating major services from JDK 8 to JDK 11 using Amazon Corretto, Amazon's no-cost distribution of OpenJDK.\n \nWe will walk through the code and dependency changes required to migrate services to JDK 11, how we measured performance, and how we safely deployed such a significant update across multiple regions in production.","talkTitle":"Learnings from migrating a production service from JDK 8 to JDK 11","talkId":106451},{"id":26597,"fromDate":"2019-11-05T16:30:00Z","toDate":"2019-11-05T17:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1159","trackName":"Cloud, Containers & Infrastructure","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png","speakers":[{"id":45803,"firstName":"Jérémie","lastName":"Drouet","company":"Docker"},{"id":45805,"firstName":"Guillaume","lastName":"Lours","company":"Docker Inc."}],"tags":[{"name":"Build Docker"},{"name":"Dockerfiles"},{"name":"Docker"}],"talkDescription":"From a Dockerfile taken \"randomly\" on Github, like a good old monolith, we will, by applying the best practices, transform this application into a set of reusable and understandable microservices.\n\nWe will start by externalizing the services used by our application using existing images and associating them in a Compose file.\n\nWe will optimize it by emptying the caches and removing unnecessary layers generated during the build of our application.\n\nWe will cut out the different build steps so that we do not have to keep the development dependencies in the final image\n\nWe will improve maintainability by using official images rather than manually installing our dependencies.\n\nWe will see how to avoid running our application as root.","talkTitle":"Dockerfile - the best practices","talkId":45907},{"id":26595,"fromDate":"2019-11-05T16:30:00Z","toDate":"2019-11-05T17:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1152","trackName":"Programming languages","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/53f80769-d8be-4ae5-a731-d5591c97d2b4.png","speakers":[{"id":13861,"firstName":"Roland","lastName":"Weisleder","company":"data experts"}],"tags":[{"name":"Development Tools"},{"name":"best practices"},{"name":"Git"}],"talkDescription":"Software often lasts longer than expected. Software is also changing more often than expected. At some point, there comes a moment where a developer looks at the code and asks: “How is this piece of code supposed to work?” A look into the git history is also not very helpful with messages like \"fixed some bugs\". This session will show some tips on how to create a comprehensible git history and what the benefits are. After this session, participants will know what to look for in their daily work with Git, and how they should use Git, so that changes to the code are still comprehensible months or years later.","talkTitle":"7 Tips to Pimp Your Git History","talkId":13911},{"id":26956,"fromDate":"2019-11-05T17:00:00Z","toDate":"2019-11-05T17:15:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":26902,"sessionTypeName":"Break","sessionTypeDuration":15,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26601,"fromDate":"2019-11-05T17:15:00Z","toDate":"2019-11-05T17:45:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1211,"roomName":"Room 4","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1160","trackName":"Architecture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png","speakers":[{"id":45707,"firstName":"Robert","lastName":"Munteanu","company":"Adobe Systems"}],"tags":[{"name":"prometheus"},{"name":"Kubernetes"},{"name":"Docker"}],"talkDescription":"Microservices were born out of a need to enable modularity at a technical and business level. With their mass adoption tehnical patterns and solution have started to emerge, and management using Kubernetes is one of the most encountered.\n\nMonitoring application state becomes tedious when using approaches designed for individual servers and deployments. Prometheus and Grafana are cloud-native solutions that make monitoring of Kubernetes deployments a simple and very fruitful task.\n\nAfter this talk participants will understand how to instrument their applications, gather metrics and act on high-level aggregate information.","talkTitle":"Crash course in Kubernetes monitoring","talkId":45456},{"id":26602,"fromDate":"2019-11-05T17:15:00Z","toDate":"2019-11-05T17:45:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1202,"roomName":"Room 5","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1158","trackName":"Mind the Geek","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/0bac192f-aa3c-4288-bad0-4dd4abdbbdc1.png","speakers":[{"id":49503,"firstName":"Jan-Peter","lastName":"Sanderman","company":"Twict"}],"tags":[{"name":"Java"},{"name":"Spring Boot"},{"name":"Raspberry Pi"},{"name":"Python"},{"name":"Pi4J"},{"name":"IoT"}],"talkDescription":"For a client of ours we build a next level escaperoom / fort boyard experience and called it: Beat the Matrix. We run a fully automated and distributed game on 60+ Raspberry Pi's, 15 Arduino's, lots of sensors and actuators, and a couple of PCs to do the VR and AR work. 32 people can play at the same time, with only 1 attendant, making in commercially attractive. This talk will be about how we built the Matrix and our lessons learned, with the main focus on the hardware part. Java and Spring Boot are used for running the software. And yes, we got a CI/CD pipeline in place. Nothing fancy here. But when it comes to hardware (and we made lots of it ourselves), there is a lot to learn and discover (when you only have a software development background just like us)! Where to start? Are you going to use a Raspberry Pi, an Arduino or something else? What's the difference? And is it really that easy to get your first LED blinking? Or is there some stuff you need to take into account? And how to continue? What if you want to scale up? How to control the GPIO pins using Java or Python? And what if you run out of GPIO pins? Come to my talk and I will get all these questions answered and get you started on hardware development or your first IoT project.","talkTitle":"Building the Matrix","talkId":49305},{"id":26604,"fromDate":"2019-11-05T17:15:00Z","toDate":"2019-11-05T17:45:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1207,"roomName":"Room 6","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":49072,"firstName":"Oleg","lastName":"Šelajev","company":"Oracle"}],"tags":[{"name":"GraalVM"},{"name":"performance"},{"name":"Containers"}],"talkDescription":"GraalVM is a high-performance polyglot runtime for dynamic, static, and native languages. One of the abilities of GraalVM is to compile Java programs ahead of time into native images that offer performance comparable to running on the JVM but have instant startup times and much lower runtime overhead. Generating native images is proven to work on real-world applications and improve their startup miraculously. In this session, you will learn how native images work and what is required to generate them and will look at several examples of compiling programs ahead of time and packaging them into minimal containers. You’ll also see how to configure native image generation, use the autoconfiguration agent for reflection, proxies and alike, and make libraries support native images out of the box. ","talkTitle":"GraalVM native images explained","talkId":104405},{"id":26603,"fromDate":"2019-11-05T17:15:00Z","toDate":"2019-11-05T17:45:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1201,"roomName":"Room 8","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1159","trackName":"Cloud, Containers & Infrastructure","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png","speakers":[{"id":50583,"firstName":"Bowie","lastName":"Brotosumpeno","company":"Egencia"},{"id":50585,"firstName":"Xavier","lastName":"Thery","company":"Egencia Europe"}],"tags":[{"name":"testing"},{"name":"DevOps"},{"name":"delivery pipeline"},{"name":"REST API"},{"name":"NPM"}],"talkDescription":"Postman is a tool that allows users to simply and quickly call APIs. Its intuitive interface, the ability to save and share query collections, as well as various other features have made this tool very popular among developers. What you may not know is that Postman now has a CLI companion called Newman. Newman is an open-source command-line client for launching Postman collections. The integration of Postman collections into the CICD then became possible.\n\nIn this session, we will show you how to create a Postman collection from an Open API specification for use in a CICD process with Newman. We will cover the techniques to treat different use cases such as synchronous call, asynchronous call, workflow, etc. Finally, Newman is also a nodejs library, which opens the possibilities of extension and customization. Coming out of this conference, you will see Postman in a different way because, in addition to being an excellent tool to manually test APIs, now it allows you to reuse your already created collections in your CICD.","talkTitle":"Postman & Newman for your CICD","talkId":51417},{"id":26600,"fromDate":"2019-11-05T17:15:00Z","toDate":"2019-11-05T17:45:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1205,"roomName":"Room 9","sessionTypeId":1254,"sessionTypeName":"Tools-in-Action","sessionTypeDuration":30,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1152","trackName":"Programming languages","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/53f80769-d8be-4ae5-a731-d5591c97d2b4.png","speakers":[{"id":38201,"firstName":"Bouke","lastName":"Nijhuis","company":"CINQ ICT"}],"tags":[{"name":"Spock"},{"name":"JUnit 5"},{"name":"Unit Testing"}],"talkDescription":"In my humble opinion Spock is a better tool for unit testing than JUnit. The presentation will give several examples to support this opinion. It will show you the areas where Spock shines. To be honest there are also things that JUnit does beter, so there will be time for that as well. Finally I will show (with a little live coding) how simple and effortless one can start testing with Spock. At the end of this session everybody should be able to write their own Spock tests and more importantly everybody will be eager to try it!","talkTitle":"Why I prefer Spock over JUnit","talkId":38154},{"id":26958,"fromDate":"2019-11-05T17:45:00Z","toDate":"2019-11-05T18:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1203,"roomName":"Exhibition Hall","sessionTypeId":26902,"sessionTypeName":"Break","sessionTypeDuration":15,"sessionTypeBreak":true,"audienceLevel":null,"langName":null,"timezone":"Europe/Brussels","trackId":null,"trackName":null,"trackImageURL":null,"speakers":null,"tags":null,"talkDescription":null,"talkTitle":null,"talkId":null},{"id":26606,"fromDate":"2019-11-05T18:00:00Z","toDate":"2019-11-05T19:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1210,"roomName":"BOF 1","sessionTypeId":1252,"sessionTypeName":"BOF","sessionTypeDuration":60,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1154","trackName":"Java Language","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png","speakers":[{"id":21051,"firstName":"Simon","lastName":"Ritter","company":"Azul Systems"}],"tags":[{"name":"JDK"},{"name":"Java"},{"name":"OpenJDK"}],"talkDescription":"Choosing which Java runtime to deploy used to be simple: for most people, it was the de facto default Oracle JDK. For those with more demanding performance requirements, the options were Zing from Azul or possibly J9 from IBM.\n\nToday, things are very different. The license for the Oracle JDK changed with the release of JDK 11, meaning to use it in production requires a paid Java SE subscription. To address the needs of Java developers, there are now a number of choices for the Java runtime, all in some way based on the OpenJDK source code.\n\nHow do you decide what distribution is right for your situation?\n\nIn this BoF, we'll have representatives from different JDK providers to help you make a choice of JDK. We'll start with some introduction and discussion of things like update delivery, backporting fixes and TCK testing. We'll then have a Q&A session where the audience can ask questions to get a clear understanding of what different distributions offer.","talkTitle":"Choosing a JDK: Ask the Distributors","talkId":21103},{"id":26605,"fromDate":"2019-11-05T18:00:00Z","toDate":"2019-11-05T19:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1206,"roomName":"BOF 2","sessionTypeId":1252,"sessionTypeName":"BOF","sessionTypeDuration":60,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1155","trackName":"Server Side Java","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/698b503d-9578-48da-85a9-bdf8ba942e3a.png","speakers":[{"id":18651,"firstName":"Emily","lastName":"Jiang","company":"IBM"},{"id":50568,"firstName":"Graham","lastName":"Charters","company":"IBM"},{"id":20104,"firstName":"Ivar","lastName":"Grimstad","company":"Eclipse Foundation"}],"tags":[{"name":"JakartaEE"},{"name":"community"},{"name":"BoF"}],"talkDescription":"An informal Jakarta EE community gathering of like minded developers, specification leads ,and Jakarta EE representatives from different companies. Last year's BOF was very well attended and generated many good ideas which we took forward to the governing community. Come, meet, and interact with many of the Jakarta EE participants in the industry.","talkTitle":"Jakarta EE Community BOF","talkId":43451},{"id":115257,"fromDate":"2019-11-05T19:00:00Z","toDate":"2019-11-05T20:00:00Z","overflow":false,"reserved":false,"remark":null,"roomId":1210,"roomName":"BOF 1","sessionTypeId":1252,"sessionTypeName":"BOF","sessionTypeDuration":60,"sessionTypeBreak":false,"audienceLevel":"BEGINNER","langName":null,"timezone":"Europe/Brussels","trackId":"1160","trackName":"Architecture","trackImageURL":"https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png","speakers":[{"id":24901,"firstName":"Andres","lastName":"Almiray","company":"Oracle"}],"tags":[{"name":"methodology"},{"name":"Documentation BOF"},{"name":"Tools"},{"name":"documentation"},{"name":"best practices"},{"name":"trends"}],"talkDescription":"People often say documentation is boring. But not us!\n\nLet’s talk about documentation. How do you write it? How do you publish it? What tools do you use? What are the current trends? How do you encourage other people to participate? How can we make documentation more approachable?\n\nLet’s share ways to improve our documentation and to encourage others to love, appreciate, and value documentation as much as we do.","talkTitle":"Writers Write: The Documentation BOF","talkId":52351}] -------------------------------------------------------------------------------- /devoxx-data/monday.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 26701, 4 | "fromDate": "2019-11-04T07:30:00Z", 5 | "toDate": "2019-11-04T08:30:00Z", 6 | "overflow": false, 7 | "reserved": false, 8 | "remark": null, 9 | "roomId": 1203, 10 | "roomName": "Exhibition Hall", 11 | "sessionTypeId": 1263, 12 | "sessionTypeName": "Registration & Breakfast", 13 | "sessionTypeDuration": 60, 14 | "sessionTypeBreak": true, 15 | "audienceLevel": null, 16 | "langName": null, 17 | "timezone": "Europe/Brussels", 18 | "trackId": null, 19 | "trackName": null, 20 | "trackImageURL": null, 21 | "speakers": null, 22 | "tags": null, 23 | "talkDescription": null, 24 | "talkTitle": null, 25 | "talkId": null 26 | }, 27 | { 28 | "id": 26564, 29 | "fromDate": "2019-11-04T08:30:00Z", 30 | "toDate": "2019-11-04T11:30:00Z", 31 | "overflow": false, 32 | "reserved": false, 33 | "remark": null, 34 | "roomId": 1211, 35 | "roomName": "Room 4", 36 | "sessionTypeId": 1256, 37 | "sessionTypeName": "Deep Dive", 38 | "sessionTypeDuration": 180, 39 | "sessionTypeBreak": false, 40 | "audienceLevel": "ADVANCED", 41 | "langName": null, 42 | "timezone": "Europe/Brussels", 43 | "trackId": "1154", 44 | "trackName": "Java Language", 45 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 46 | "speakers": [ 47 | { 48 | "id": 109256, 49 | "firstName": "Kirk", 50 | "lastName": "Pepperdine", 51 | "company": null 52 | } 53 | ], 54 | "tags": [ 55 | { 56 | "name": "OutOfMemoryError" 57 | }, 58 | { 59 | "name": "memory leaks" 60 | }, 61 | { 62 | "name": "JVM" 63 | } 64 | ], 65 | "talkDescription": "One of the more important aspects of the Java Virtual Machine (JVM) is it’s managed memory subsystem. It’s an amazing piece of technology in that it allows developers to allocate a seemingly infinite amount of memory. The reality is that under the covers, the JVM is working on reclaiming all memory that is no longer in use. If the JVM is unable to recover memory, our application will fail with a dreaded OutOfMemoryError.\n\nThis session will cover several common scenarios that can cause the JVM to fail with an OutOfMemoryError. We’ll explore tooling and methods that can be used to diagnose the cause of an OutOfMemoryError. Finally, we’ll go toe to toe with apps suffer from an OutOfMemoryError for different reasons. Topics that will be covered include; 1. Overview of Java heap 2. Allocations in Java heap 3. GC basics with Mark and Sweep 4. Normal life cycle of a Java object 5. Common causes of OutOfMemoryError 6. Anatomy of a memory leak 7. Tools for detecting memory leaks", 66 | "talkTitle": "Solving Memory Leaks in the JVM", 67 | "talkId": 109305 68 | }, 69 | { 70 | "id": 26554, 71 | "fromDate": "2019-11-04T08:30:00Z", 72 | "toDate": "2019-11-04T11:30:00Z", 73 | "overflow": false, 74 | "reserved": false, 75 | "remark": null, 76 | "roomId": 1202, 77 | "roomName": "Room 5", 78 | "sessionTypeId": 1256, 79 | "sessionTypeName": "Deep Dive", 80 | "sessionTypeDuration": 180, 81 | "sessionTypeBreak": false, 82 | "audienceLevel": "BEGINNER", 83 | "langName": null, 84 | "timezone": "Europe/Brussels", 85 | "trackId": "1154", 86 | "trackName": "Java Language", 87 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 88 | "speakers": [ 89 | { 90 | "id": 49072, 91 | "firstName": "Oleg", 92 | "lastName": "Šelajev", 93 | "company": "Oracle" 94 | } 95 | ], 96 | "tags": [ 97 | { 98 | "name": "GraalVM" 99 | }, 100 | { 101 | "name": "performance" 102 | }, 103 | { 104 | "name": "JVM" 105 | } 106 | ], 107 | "talkDescription": "GraalVM is a high-performance runtime for dynamic, static, and native languages. GraalVM supports Java, Scala, Kotlin, Groovy, and other JVM-based languages. At the same time, it can run the dynamic scripting languages JavaScript including node.js, Ruby, R, and Python. \nGraalVM answers different performance questions and offers state-of-the-art solutions for peak-performance, startup or memory usage requirements. It's a versatile and large project, which we'll try to introduce thoroughly during this session. \nWe'll look at running Java applications with GraalVM, creating GraalVM native images, running dynamic languages with GraalVM and how to make them work with your existing Java code base. \nGraalVM has an excellent JIT compiler and we'll look at several benchmarks uncovering which optimisations are the most essential and what code patterns get the largest performance boost. \nWe'll explain the trade-offs between running GraalVM JIT vs. GraalVM AOT, and look at the examples of GraalVM native images. \nYou'll learn how GraalVM implements support for the languages and what are the best practices for using them together. \n\nThis session gives you a deep overview of GraalVM capabilities and allows you to effectively understand when GraalVM can help you and how to start using it. ", 108 | "talkTitle": "Everything you need to know about GraalVM", 109 | "talkId": 52356 110 | }, 111 | { 112 | "id": 26555, 113 | "fromDate": "2019-11-04T08:30:00Z", 114 | "toDate": "2019-11-04T11:30:00Z", 115 | "overflow": false, 116 | "reserved": false, 117 | "remark": null, 118 | "roomId": 1207, 119 | "roomName": "Room 6", 120 | "sessionTypeId": 1256, 121 | "sessionTypeName": "Deep Dive", 122 | "sessionTypeDuration": 180, 123 | "sessionTypeBreak": false, 124 | "audienceLevel": "BEGINNER", 125 | "langName": null, 126 | "timezone": "Europe/Brussels", 127 | "trackId": "1153", 128 | "trackName": "Big Data & Machine Learning", 129 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png", 130 | "speakers": [ 131 | { 132 | "id": 53352, 133 | "firstName": "Abraham", 134 | "lastName": "Kang", 135 | "company": "GEEEE, LLC" 136 | } 137 | ], 138 | "tags": [ 139 | { 140 | "name": "Machine learning" 141 | }, 142 | { 143 | "name": "Machine Learning for Developers" 144 | }, 145 | { 146 | "name": "security" 147 | } 148 | ], 149 | "talkDescription": "Machine Learning is the future and in some cases the present. Most developers and hackers alike are new to this area. At first blush, machine learning looks incredibly difficult. Linear algebra, calculus, statistics, probability, and advanced mathematics. Come to my talk to get a quick understanding of neural networks and the associated hacking methods used against them: trojaning, adversarial examples, adversarial patches, data poisoning, model extraction and training data leakage. Although this talk covers a complex topic, the ideas are explained such that all levels of developers will benefit.", 150 | "talkTitle": "Understanding Security Threats Against Machine/Deep Learning Applications", 151 | "talkId": 53701 152 | }, 153 | { 154 | "id": 26552, 155 | "fromDate": "2019-11-04T08:30:00Z", 156 | "toDate": "2019-11-04T11:30:00Z", 157 | "overflow": false, 158 | "reserved": false, 159 | "remark": null, 160 | "roomId": 1201, 161 | "roomName": "Room 8", 162 | "sessionTypeId": 1256, 163 | "sessionTypeName": "Deep Dive", 164 | "sessionTypeDuration": 180, 165 | "sessionTypeBreak": false, 166 | "audienceLevel": "BEGINNER", 167 | "langName": null, 168 | "timezone": "Europe/Brussels", 169 | "trackId": "1155", 170 | "trackName": "Server Side Java", 171 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/698b503d-9578-48da-85a9-bdf8ba942e3a.png", 172 | "speakers": [ 173 | { 174 | "id": 44103, 175 | "firstName": "Mario", 176 | "lastName": "Fusco", 177 | "company": "Red Hat" 178 | }, 179 | { 180 | "id": 40703, 181 | "firstName": "Maciej", 182 | "lastName": "Swiderski", 183 | "company": "Red Hat" 184 | }, 185 | { 186 | "id": 8701, 187 | "firstName": "Edoardo", 188 | "lastName": "Vacchi", 189 | "company": "Red Hat" 190 | } 191 | ], 192 | "tags": [ 193 | { 194 | "name": "Drools" 195 | }, 196 | { 197 | "name": "Cloud Native Java" 198 | }, 199 | { 200 | "name": "microservices architectures" 201 | }, 202 | { 203 | "name": "GraalVM" 204 | }, 205 | { 206 | "name": "Quarkus" 207 | }, 208 | { 209 | "name": "Live Coding & Demos" 210 | } 211 | ], 212 | "talkDescription": "Java is entering a new era, the cloud native one. Thanks to GraalVM it can be made smaller, lighter and faster, keeping all its power. This innovative way of developing and deploying Java applications has been pushed to the next level by Quarkus that provides a full-stack development experience seamlessly integrating many widely used Java libraries and thus opens the door for next generation of middleware. Business automation is an important players in this context and Kogito, a new Java toolkit based on Drools and jBPM, is made to bring rules and processes to the Quarkus world.\n\nAfter a quick introduction to Kogito we'll show in a live conding session how it can be used to build cloud ready event-driven business applications. Starting from scratch we'll create micorservices implementing the business logic of a complex domain with rules and modelling its workflows through business processes. We will demonstrate how Quarkus hot reload capabilities can be used to design this business logic in an iterative way, how to integrate these services with Kafka to process business events, how to monitor them with Prometheus and Grafana and finally how to deploy everything into the cloud.", 213 | "talkTitle": "Event-driven business automation powered by cloud native Java", 214 | "talkId": 44155 215 | }, 216 | { 217 | "id": 26551, 218 | "fromDate": "2019-11-04T08:30:00Z", 219 | "toDate": "2019-11-04T11:30:00Z", 220 | "overflow": false, 221 | "reserved": false, 222 | "remark": null, 223 | "roomId": 1205, 224 | "roomName": "Room 9", 225 | "sessionTypeId": 1256, 226 | "sessionTypeName": "Deep Dive", 227 | "sessionTypeDuration": 180, 228 | "sessionTypeBreak": false, 229 | "audienceLevel": "BEGINNER", 230 | "langName": null, 231 | "timezone": "Europe/Brussels", 232 | "trackId": "1159", 233 | "trackName": "Cloud, Containers & Infrastructure", 234 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png", 235 | "speakers": [ 236 | { 237 | "id": 49513, 238 | "firstName": "Alberto", 239 | "lastName": "Rios", 240 | "company": "Pivotal" 241 | }, 242 | { 243 | "id": 45708, 244 | "firstName": "Oliver", 245 | "lastName": "Hughes", 246 | "company": "Pivotal" 247 | } 248 | ], 249 | "tags": [ 250 | { 251 | "name": "devops" 252 | }, 253 | { 254 | "name": "Kubernetes" 255 | }, 256 | { 257 | "name": "Cloud Native Applications" 258 | } 259 | ], 260 | "talkDescription": "The Kubernetes hype train has reached full velocity and many organisations are now adopting the technology. The Kubernetes ecosystem can be very operator focussed and it can be a challenge for developers to distil the information that is relevant for their job. There are a large number of available tools aimed at solving a broad set of problems but it can be daunting choosing which to invest in. This deep dive sessions aims to provide developers with a thorough grounding on Kubernetes concepts, suggest best practices and get hands-on with some of the essential tooling. Topics will include \n* Local development workflow\n* Approaches for building images from source\n* Image Tagging Strategies\n* Using profiles\n* Deployment\n* Remote build services\n* Automated testing & Kubernetes\n* Debugging apps on Kubernetes\n* Provisioning a persistent data store with your application\n* Packaging your service as a Cloud Native Application Bundle\n* Health monitoring and management of running services\n* Log aggregation\n* TLS Termination\n* Integrating with Kubernetes security\n* Externalised Configuration & Secrets\n* Service to Service communication & discovery\n* Ingress Controllers\n* Observability of applications", 261 | "talkTitle": "Kubernetes Distilled - an in depth guide for the busy Java developer", 262 | "talkId": 45460 263 | }, 264 | { 265 | "id": 26887, 266 | "fromDate": "2019-11-04T08:30:00Z", 267 | "toDate": "2019-11-04T11:30:00Z", 268 | "overflow": false, 269 | "reserved": false, 270 | "remark": null, 271 | "roomId": 1210, 272 | "roomName": "BOF 1", 273 | "sessionTypeId": 1262, 274 | "sessionTypeName": "Hands-on Lab", 275 | "sessionTypeDuration": 180, 276 | "sessionTypeBreak": false, 277 | "audienceLevel": "BEGINNER", 278 | "langName": null, 279 | "timezone": "Europe/Brussels", 280 | "trackId": "1154", 281 | "trackName": "Java Language", 282 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 283 | "speakers": [ 284 | { 285 | "id": 36451, 286 | "firstName": "Sergei", 287 | "lastName": "Egorov", 288 | "company": "Pivotal" 289 | } 290 | ], 291 | "tags": [ 292 | { 293 | "name": "Java" 294 | }, 295 | { 296 | "name": "testing" 297 | }, 298 | { 299 | "name": "Docker" 300 | } 301 | ], 302 | "talkDescription": "Unit testing is fine, but without proper integration testing, especially if you work with external resources like databases and other services, you might not know how your application will actually behave once it has been deployed to the real production environment.\n\nBefore Docker, configuring the environment for integration testing was painful – people were using fake database implementations, mocking servers, usually it was not cross-platform as well. However, thanks to Docker, now we can quickly prepare the environment for our tests.\n\nIn this workshop we would like to show how you can use Testcontainers ( https://github.com/testcontainers/testcontainers-java ) – a popular Java testing library that provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. We will integrate it into a Spring Boot microservice and use real PostgreSQL and Redis databases to test it, will isolate it from other microservices, and maybe even start Selenium browsers in Docker and test our application, all with the same library!", 303 | "talkTitle": "Integration testing with Docker and Testcontainers", 304 | "talkId": 36502 305 | }, 306 | { 307 | "id": 26886, 308 | "fromDate": "2019-11-04T08:30:00Z", 309 | "toDate": "2019-11-04T11:30:00Z", 310 | "overflow": false, 311 | "reserved": false, 312 | "remark": null, 313 | "roomId": 1206, 314 | "roomName": "BOF 2", 315 | "sessionTypeId": 1262, 316 | "sessionTypeName": "Hands-on Lab", 317 | "sessionTypeDuration": 180, 318 | "sessionTypeBreak": false, 319 | "audienceLevel": "BEGINNER", 320 | "langName": null, 321 | "timezone": "Europe/Brussels", 322 | "trackId": "1152", 323 | "trackName": "Programming languages", 324 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/53f80769-d8be-4ae5-a731-d5591c97d2b4.png", 325 | "speakers": [ 326 | { 327 | "id": 22101, 328 | "firstName": "Paul", 329 | "lastName": "Watson", 330 | "company": "PDWTech" 331 | }, 332 | { 333 | "id": 52601, 334 | "firstName": "Andy", 335 | "lastName": "Bell", 336 | "company": "Virtual Perfection" 337 | } 338 | ], 339 | "tags": [ 340 | { 341 | "name": "programming languages" 342 | }, 343 | { 344 | "name": "building tools" 345 | }, 346 | { 347 | "name": "functional programming language" 348 | } 349 | ], 350 | "talkDescription": "The language that everyone wants to learn. Famed for its speed, correctness and memory safety, Rust is an up and coming language that has reached a level of maturity and should be considered for a space in our developer toolbox.\n\nWe will cover the fundamentals of Rust from the perspective of developers who's main language is JVM based: How do I start? What is familiar? What is different? What to avoid?\n\nIn this lab we will learn Rust by building a command-line application together. \n\nNo previous experience is necessary but you should be familiar with Java or similar.\n", 351 | "talkTitle": "Rust for Java Developers", 352 | "talkId": 52078 353 | }, 354 | { 355 | "id": 26703, 356 | "fromDate": "2019-11-04T11:30:00Z", 357 | "toDate": "2019-11-04T12:30:00Z", 358 | "overflow": false, 359 | "reserved": false, 360 | "remark": null, 361 | "roomId": 1203, 362 | "roomName": "Exhibition Hall", 363 | "sessionTypeId": 26751, 364 | "sessionTypeName": "Lunch", 365 | "sessionTypeDuration": 60, 366 | "sessionTypeBreak": true, 367 | "audienceLevel": null, 368 | "langName": null, 369 | "timezone": "Europe/Brussels", 370 | "trackId": null, 371 | "trackName": null, 372 | "trackImageURL": null, 373 | "speakers": null, 374 | "tags": null, 375 | "talkDescription": null, 376 | "talkTitle": null, 377 | "talkId": null 378 | }, 379 | { 380 | "id": 26559, 381 | "fromDate": "2019-11-04T12:30:00Z", 382 | "toDate": "2019-11-04T15:30:00Z", 383 | "overflow": false, 384 | "reserved": false, 385 | "remark": null, 386 | "roomId": 1211, 387 | "roomName": "Room 4", 388 | "sessionTypeId": 1256, 389 | "sessionTypeName": "Deep Dive", 390 | "sessionTypeDuration": 180, 391 | "sessionTypeBreak": false, 392 | "audienceLevel": "BEGINNER", 393 | "langName": null, 394 | "timezone": "Europe/Brussels", 395 | "trackId": "1157", 396 | "trackName": "Front End", 397 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e8f80f6a-89da-49e9-993c-bc94be9ca14b.png", 398 | "speakers": [ 399 | { 400 | "id": 50822, 401 | "firstName": "Noël", 402 | "lastName": "Macé", 403 | "company": "" 404 | } 405 | ], 406 | "tags": [ 407 | { 408 | "name": "buzzwords" 409 | }, 410 | { 411 | "name": "performance" 412 | }, 413 | { 414 | "name": "Web API" 415 | }, 416 | { 417 | "name": "reliability" 418 | }, 419 | { 420 | "name": "user experience" 421 | }, 422 | { 423 | "name": "innovations" 424 | }, 425 | { 426 | "name": "PWA" 427 | } 428 | ], 429 | "talkDescription": "The F.I.R.E. safety kit for everyone! Learn all the best new capabilities of the Modern Web in one shot without burning out!\n\nFour years ago the idea of _Progressive Web Apps_ arrived in the world! It brought a whole new approach to mobile & web apps development, often summarized as F.I.R.E. (Fast Integrated Reliable & Engaging). But the web platform is constantly evolving and mutating, so how has F.I.R.E. technology evolved with it?\n\nJoin me to explore four cutting-edge technologies (one for each F.I.R.E. concept) that will help bring your web apps to the next level!", 430 | "talkTitle": "The Web is on \uD83D\uDD25 F.I.R.E. \uD83D\uDD25 !!!", 431 | "talkId": 51716 432 | }, 433 | { 434 | "id": 26557, 435 | "fromDate": "2019-11-04T12:30:00Z", 436 | "toDate": "2019-11-04T15:30:00Z", 437 | "overflow": false, 438 | "reserved": false, 439 | "remark": null, 440 | "roomId": 1202, 441 | "roomName": "Room 5", 442 | "sessionTypeId": 1256, 443 | "sessionTypeName": "Deep Dive", 444 | "sessionTypeDuration": 180, 445 | "sessionTypeBreak": false, 446 | "audienceLevel": "BEGINNER", 447 | "langName": null, 448 | "timezone": "Europe/Brussels", 449 | "trackId": "1154", 450 | "trackName": "Java Language", 451 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 452 | "speakers": [ 453 | { 454 | "id": 50558, 455 | "firstName": "Piotr", 456 | "lastName": "Przybyl", 457 | "company": "@piotrprz" 458 | } 459 | ], 460 | "tags": [ 461 | { 462 | "name": "Java 12" 463 | }, 464 | { 465 | "name": "enhancements" 466 | }, 467 | { 468 | "name": "API changes" 469 | }, 470 | { 471 | "name": "Java 11" 472 | } 473 | ], 474 | "talkDescription": "Hey, there were two major Java versions released since last Devoxx!\nWe don't have to wait 3 years or so for new features any more. Isn't that cool? ;-)\nSo... you'd like to check what has happened since Java 11?\nSwitch expressions? String blocks? New functions in String, Streams and other APIs? What are the Shenandoah and ZGC about? AppCDS to speed up spin-off?\nIf you find them interesting, let's dive deep together into new interesting stuff.\n", 475 | "talkTitle": "Java 12 & 13. What's new and noteworthy?", 476 | "talkId": 50268 477 | }, 478 | { 479 | "id": 26558, 480 | "fromDate": "2019-11-04T12:30:00Z", 481 | "toDate": "2019-11-04T15:30:00Z", 482 | "overflow": false, 483 | "reserved": false, 484 | "remark": null, 485 | "roomId": 1207, 486 | "roomName": "Room 6", 487 | "sessionTypeId": 1256, 488 | "sessionTypeName": "Deep Dive", 489 | "sessionTypeDuration": 180, 490 | "sessionTypeBreak": false, 491 | "audienceLevel": "BEGINNER", 492 | "langName": null, 493 | "timezone": "Europe/Brussels", 494 | "trackId": "1153", 495 | "trackName": "Big Data & Machine Learning", 496 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png", 497 | "speakers": [ 498 | { 499 | "id": 45802, 500 | "firstName": "Charalampos", 501 | "lastName": "Xanthopoulakis", 502 | "company": "ASML" 503 | } 504 | ], 505 | "tags": [ 506 | { 507 | "name": "Big Data" 508 | }, 509 | { 510 | "name": "Design" 511 | }, 512 | { 513 | "name": "Open data" 514 | } 515 | ], 516 | "talkDescription": "Everyone nowadays is obsessed about Big Data, but is it really enough to make a difference? Big Data is in fact like raw ore; you need to process it the right way to reveal its real treasure. Data visualizations allow us to gain knowledge out of pure texts and numbers, to tell the stories that lie behind the data. In this interactive workshop, we are talking about the thought process, the techniques, the tools and technologies on how your data can show its deeper meaning all the way from cancer diagnosis and microelectronics to housing prices and even your own zodiac sign!\n\nLearning Outcomes\nExperience at first hand the thought process behind engaging data visualisations used in the industry and the academia\nLearn how to think visually\nExperiment with known javascript-based data-visualisation libraries, such as D3.js, highcharts.js, and Vega\nTell the story your data has to reveal in a fun and creative way", 517 | "talkTitle": "Use your data to tell stories", 518 | "talkId": 45908 519 | }, 520 | { 521 | "id": 26560, 522 | "fromDate": "2019-11-04T12:30:00Z", 523 | "toDate": "2019-11-04T15:30:00Z", 524 | "overflow": false, 525 | "reserved": false, 526 | "remark": null, 527 | "roomId": 1201, 528 | "roomName": "Room 8", 529 | "sessionTypeId": 1256, 530 | "sessionTypeName": "Deep Dive", 531 | "sessionTypeDuration": 180, 532 | "sessionTypeBreak": false, 533 | "audienceLevel": "BEGINNER", 534 | "langName": null, 535 | "timezone": "Europe/Brussels", 536 | "trackId": "1155", 537 | "trackName": "Server Side Java", 538 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/698b503d-9578-48da-85a9-bdf8ba942e3a.png", 539 | "speakers": [ 540 | { 541 | "id": 10201, 542 | "firstName": "Graeme", 543 | "lastName": "Rocher", 544 | "company": "Object Computing" 545 | } 546 | ], 547 | "tags": [ 548 | { 549 | "name": "Java" 550 | }, 551 | { 552 | "name": "MicroServices" 553 | }, 554 | { 555 | "name": "Apache Groovy" 556 | }, 557 | { 558 | "name": "Micronaut" 559 | }, 560 | { 561 | "name": "Kotlin" 562 | } 563 | ], 564 | "talkDescription": "This session is for developers looking to go beyond the basics with Micronaut, a new microservices and serverless framework for Java, Kotlin, and Groovy. Taking an extensive look at how advanced features such as dependency injection (DI), aspect-oriented programming (AOP), and ahead-of-time (AOT) compilation work, the creator of Micronaut, Graeme Rocher, will walk attendees through Micronaut’s elegant programming model. Attendees will come away with a better understanding about the motivations behind Micronaut's design.", 565 | "talkTitle": "Micronaut Deep Dive", 566 | "talkId": 10251 567 | }, 568 | { 569 | "id": 26556, 570 | "fromDate": "2019-11-04T12:30:00Z", 571 | "toDate": "2019-11-04T15:30:00Z", 572 | "overflow": false, 573 | "reserved": false, 574 | "remark": null, 575 | "roomId": 1205, 576 | "roomName": "Room 9", 577 | "sessionTypeId": 1256, 578 | "sessionTypeName": "Deep Dive", 579 | "sessionTypeDuration": 180, 580 | "sessionTypeBreak": false, 581 | "audienceLevel": "BEGINNER", 582 | "langName": null, 583 | "timezone": "Europe/Brussels", 584 | "trackId": "1151", 585 | "trackName": "Methodology & Culture", 586 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png", 587 | "speakers": [ 588 | { 589 | "id": 33901, 590 | "firstName": "Kate", 591 | "lastName": "Wardin", 592 | "company": "Target Corp & Developer First " 593 | } 594 | ], 595 | "tags": [ 596 | { 597 | "name": "tech lead" 598 | }, 599 | { 600 | "name": "lead" 601 | }, 602 | { 603 | "name": "culture" 604 | } 605 | ], 606 | "talkDescription": "Be prepared to challenge your preexisting perspectives of technical leadership as we explore non-traditional approaches and techniques in these immersive, hands-on workshops and presentations. \n\nYou will be required to step outside your comfort zone as you share personal experiences and discuss challenging topics such as: giving feedback, working with different communication styles, facilitating effective (non-awkward) 1:1s, practicing authenticity, empowering developers to reach their full potential, and establishing powerful and bullet-proof morning routines to maximize your busy schedules.\n", 607 | "talkTitle": "Developer First: A New Leadership Mindset", 608 | "talkId": 33951 609 | }, 610 | { 611 | "id": 26889, 612 | "fromDate": "2019-11-04T12:30:00Z", 613 | "toDate": "2019-11-04T15:30:00Z", 614 | "overflow": false, 615 | "reserved": false, 616 | "remark": null, 617 | "roomId": 1210, 618 | "roomName": "BOF 1", 619 | "sessionTypeId": 1262, 620 | "sessionTypeName": "Hands-on Lab", 621 | "sessionTypeDuration": 180, 622 | "sessionTypeBreak": false, 623 | "audienceLevel": "BEGINNER", 624 | "langName": null, 625 | "timezone": "Europe/Brussels", 626 | "trackId": "1154", 627 | "trackName": "Java Language", 628 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 629 | "speakers": [ 630 | { 631 | "id": 18751, 632 | "firstName": "Kamesh", 633 | "lastName": "Sampath", 634 | "company": "Red Hat India" 635 | }, 636 | { 637 | "id": 21401, 638 | "firstName": "Emmanuel", 639 | "lastName": "Bernard", 640 | "company": "Red Hat" 641 | } 642 | ], 643 | "tags": [ 644 | { 645 | "name": "Java" 646 | }, 647 | { 648 | "name": "Cloud Native Java" 649 | }, 650 | { 651 | "name": "Kubernetes" 652 | }, 653 | { 654 | "name": "GraalVM" 655 | }, 656 | { 657 | "name": "Hibernate" 658 | }, 659 | { 660 | "name": "Quarkus" 661 | } 662 | ], 663 | "talkDescription": "Java assumed the whole computer belonged to itself, that it could consume all available memory and CPU. In this presentation, we will demonstrate the problems associated using Java for “microservices”, and how the open source ecosystem is working to insure the future of Java by being cloud first, container native, serverless focused and Kubernetes optimized. This is where GraalVM meets Quarkus (https://quarkus.io), bringing server-side and enterprise-capable Java to enable you to build truly cloud native apps.\n\nAs part of this workshop the developers will learn the basics of how to create their first Quarkus app, run in development mode, build JVM and native artifacts, make them as linux containers and deploy into Kubernetes. The workshop also teaches the developers how quickly they can build database applications using Hibernate.", 664 | "talkTitle": "Learn to build Cloud Native Java Applications with Quarkus", 665 | "talkId": 18803 666 | }, 667 | { 668 | "id": 26888, 669 | "fromDate": "2019-11-04T12:30:00Z", 670 | "toDate": "2019-11-04T15:30:00Z", 671 | "overflow": false, 672 | "reserved": false, 673 | "remark": null, 674 | "roomId": 1206, 675 | "roomName": "BOF 2", 676 | "sessionTypeId": 1262, 677 | "sessionTypeName": "Hands-on Lab", 678 | "sessionTypeDuration": 180, 679 | "sessionTypeBreak": false, 680 | "audienceLevel": "INTERMEDIATE", 681 | "langName": null, 682 | "timezone": "Europe/Brussels", 683 | "trackId": "1156", 684 | "trackName": "Security", 685 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/fab122c4-5e16-4e83-a3da-fad00870c886.png", 686 | "speakers": [ 687 | { 688 | "id": 19853, 689 | "firstName": "Andreas", 690 | "lastName": "Falk", 691 | "company": "Novatec Consulting GmbH" 692 | } 693 | ], 694 | "tags": [ 695 | { 696 | "name": "OAuth 2.0" 697 | }, 698 | { 699 | "name": "Spring Security" 700 | }, 701 | { 702 | "name": "OpenID Connect" 703 | } 704 | ], 705 | "talkDescription": "Have you ever wondered what the heck is OpenID Connect and how it differs from OAuth 2.0? Are Grant Types, Flows, JOSE, JWT or JWK unknown beings for you?\nThen this workshop is a great opportunity for you to get to know all these things by getting your hands dirty in code using Spring Security 5.\nAfter a short introduction to the basic concepts of OAuth 2.0 and OpenID Connect 1.0, we will take an existing sample spring boot application to implement authentication with OpenID Connect (OIDC) in several steps.\n\nDuring the hands-on part we will cover the following parts:\n\n- Best practices to avoid OWASP Top 10 security risks of broken authentication and access controls\n- Usage of a certified OpenID Connect Provider Server\n- Insights into the authorization code flow of OAuth 2.0/OpenID Connect 1.0\n- Basic implementation of a Resource Server\n- Authorization with automatically mapped OIDC Scopes\n- Custom mapping of OIDC claims to Spring Security roles and authorities\n- Extended validation of JWT’s\n- Realization of an OIDC Login Client\n- Differences in OIDC/OAuth 2.0 support for servlet-based and reactive web stacks (during hands-on we will mainly use the servlet-based web stack)\n\nThe workshop will be complemented with current best practices in OIDC & OAuth 2.0 and will end with an outlook on what’s coming with the next Spring Security version.\nPrerequisites: General experience in Java and Spring-Boot is expected. For the Hands-On part, you’ll need a notebook with JDK 8, 9 or 11 and a Java IDE of your choice.", 706 | "talkTitle": "Securing Microservices with OpenID Connect and Spring Security 5", 707 | "talkId": 19706 708 | }, 709 | { 710 | "id": 26951, 711 | "fromDate": "2019-11-04T15:30:00Z", 712 | "toDate": "2019-11-04T15:45:00Z", 713 | "overflow": false, 714 | "reserved": false, 715 | "remark": null, 716 | "roomId": 1203, 717 | "roomName": "Exhibition Hall", 718 | "sessionTypeId": 26902, 719 | "sessionTypeName": "Break", 720 | "sessionTypeDuration": 15, 721 | "sessionTypeBreak": true, 722 | "audienceLevel": null, 723 | "langName": null, 724 | "timezone": "Europe/Brussels", 725 | "trackId": null, 726 | "trackName": null, 727 | "trackImageURL": null, 728 | "speakers": null, 729 | "tags": null, 730 | "talkDescription": null, 731 | "talkTitle": null, 732 | "talkId": null 733 | }, 734 | { 735 | "id": 26571, 736 | "fromDate": "2019-11-04T15:45:00Z", 737 | "toDate": "2019-11-04T16:15:00Z", 738 | "overflow": false, 739 | "reserved": false, 740 | "remark": null, 741 | "roomId": 1211, 742 | "roomName": "Room 4", 743 | "sessionTypeId": 1254, 744 | "sessionTypeName": "Tools-in-Action", 745 | "sessionTypeDuration": 30, 746 | "sessionTypeBreak": false, 747 | "audienceLevel": "BEGINNER", 748 | "langName": null, 749 | "timezone": "Europe/Brussels", 750 | "trackId": "1160", 751 | "trackName": "Architecture", 752 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png", 753 | "speakers": [ 754 | { 755 | "id": 44108, 756 | "firstName": "Horacio", 757 | "lastName": "Gonzalez", 758 | "company": "OVH" 759 | } 760 | ], 761 | "tags": [ 762 | { 763 | "name": "Cloud." 764 | }, 765 | { 766 | "name": "Kubernetes" 767 | }, 768 | { 769 | "name": "architecture" 770 | } 771 | ], 772 | "talkDescription": "Judging by the buzz it has created, this last year has been the year of Kubernetes. It is everywhere, and as usual with such popular subjects, there is a huge stash of content about it: tutorials, blog posts, talks by the dozen, everybody seems to be speaking about Kubernetes… All is well in the best of worlds, right?\n\nWell, to be sincere, I wouldn’t say so… Most of those tutorial, posts and talks stop just after they have guided you to do the “Hello Kube”, when you have a handful of applications deployed on a local Minikube on your laptop. But that is not the end, it’s more of the true beginning of the path…\n\nIn this talk I’m going to speak about the gap between Minikube and a production-ready Kubernetes infrastructure, about the dozens of “small details” that become show stoppers the first time you try to deploy your production Kubernetes, about the usefulness of managed Kubernetes solutions, about vendor locking, about multicloud and Kubernetes federation. In brief, about what to do after you have deployed on your Minikube…", 773 | "talkTitle": "I have deployed my app on Minikube... and now what?", 774 | "talkId": 44169 775 | }, 776 | { 777 | "id": 26572, 778 | "fromDate": "2019-11-04T15:45:00Z", 779 | "toDate": "2019-11-04T16:15:00Z", 780 | "overflow": false, 781 | "reserved": false, 782 | "remark": null, 783 | "roomId": 1202, 784 | "roomName": "Room 5", 785 | "sessionTypeId": 1254, 786 | "sessionTypeName": "Tools-in-Action", 787 | "sessionTypeDuration": 30, 788 | "sessionTypeBreak": false, 789 | "audienceLevel": "BEGINNER", 790 | "langName": null, 791 | "timezone": "Europe/Brussels", 792 | "trackId": "1154", 793 | "trackName": "Java Language", 794 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 795 | "speakers": [ 796 | { 797 | "id": 52605, 798 | "firstName": "José", 799 | "lastName": "Paumard", 800 | "company": "Independant (very)" 801 | } 802 | ], 803 | "tags": [ 804 | { 805 | "name": "Java SE" 806 | }, 807 | { 808 | "name": "Java" 809 | }, 810 | { 811 | "name": "future" 812 | } 813 | ], 814 | "talkDescription": "The JDK is an open source project that you can download and build yourself! All the new things under work are available on Mercurial branches, that you can get and compile to test them before they are released. It allows you to play with them, see how they work, see what do the new syntaxes look like. In short: you can play now with a JDK from the future, that may never exist! We will show how all this work, from the installation of a Ubuntu virtual machine to the execution of a home made JDK that will never be released. ", 815 | "talkTitle": "Building your own JDK in 10 steps", 816 | "talkId": 54102 817 | }, 818 | { 819 | "id": 26573, 820 | "fromDate": "2019-11-04T15:45:00Z", 821 | "toDate": "2019-11-04T16:15:00Z", 822 | "overflow": false, 823 | "reserved": false, 824 | "remark": null, 825 | "roomId": 1207, 826 | "roomName": "Room 6", 827 | "sessionTypeId": 1254, 828 | "sessionTypeName": "Tools-in-Action", 829 | "sessionTypeDuration": 30, 830 | "sessionTypeBreak": false, 831 | "audienceLevel": "BEGINNER", 832 | "langName": null, 833 | "timezone": "Europe/Brussels", 834 | "trackId": "1153", 835 | "trackName": "Big Data & Machine Learning", 836 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png", 837 | "speakers": [ 838 | { 839 | "id": 37351, 840 | "firstName": "Alexis", 841 | "lastName": "Duque", 842 | "company": "Rtone" 843 | } 844 | ], 845 | "tags": [ 846 | { 847 | "name": "Machine learning" 848 | }, 849 | { 850 | "name": "IoT" 851 | }, 852 | { 853 | "name": "TensorFlow" 854 | } 855 | ], 856 | "talkDescription": "While Machine Learning is usually deployed in the cloud, lightweight versions of these algorithms that fit for constrained IoT systems such as microcontrollers are appearing.\nUsing Machine Learning « at-the-edge » has indeed several advantages such as the reduction of network latency, it provides better privacy, and are working offline.\nIn this presentation, we will demonstrate how to deploy Deep Learning algorithms on IoT devices thanks to TensorFlow Lite. We will see how to use it to design a smart vertical farming system able to predict and optimize the plant growth, at home or in developing countries where a reliable Internet connection still is missing.", 857 | "talkTitle": "Make your IoT even Smarter with Tensorflow Lite to Design the Future of Vertical Farming", 858 | "talkId": 37401 859 | }, 860 | { 861 | "id": 26575, 862 | "fromDate": "2019-11-04T15:45:00Z", 863 | "toDate": "2019-11-04T16:15:00Z", 864 | "overflow": false, 865 | "reserved": false, 866 | "remark": null, 867 | "roomId": 1201, 868 | "roomName": "Room 8", 869 | "sessionTypeId": 1254, 870 | "sessionTypeName": "Tools-in-Action", 871 | "sessionTypeDuration": 30, 872 | "sessionTypeBreak": false, 873 | "audienceLevel": "BEGINNER", 874 | "langName": null, 875 | "timezone": "Europe/Brussels", 876 | "trackId": "1155", 877 | "trackName": "Server Side Java", 878 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/698b503d-9578-48da-85a9-bdf8ba942e3a.png", 879 | "speakers": [ 880 | { 881 | "id": 24905, 882 | "firstName": "Michel", 883 | "lastName": "Schudel", 884 | "company": "Craftsmen" 885 | } 886 | ], 887 | "tags": [ 888 | { 889 | "name": "Java" 890 | }, 891 | { 892 | "name": "MicroServices" 893 | }, 894 | { 895 | "name": "Micronaut" 896 | }, 897 | { 898 | "name": "Quarkus" 899 | }, 900 | { 901 | "name": "comparison" 902 | } 903 | ], 904 | "talkDescription": "Micronaut and Quarkus are two cool emerging Java backend frameworks that aim to solve some problems that exist in current frameworks, like faster startup, low memory footprint, and support for ahead-of-time compilation using GraalVM.\n\nIn this session, we'll square off both frameworks against each other. How do they compare, what are the stronger and weaker points of both frameworks? \n\nWe'll compare the following features:\n- Initializing your project\n- Building your first restcontroller / programming model\n- Startup time\n- Database support\n- Integration test support\n- Building native images\n- Memory usage and JAR sizes\n- Ease of cloud deployment\n\nIn the end, we might have a clear winner! ... or will we?\n", 905 | "talkTitle": "Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! ", 906 | "talkId": 24955 907 | }, 908 | { 909 | "id": 26574, 910 | "fromDate": "2019-11-04T15:45:00Z", 911 | "toDate": "2019-11-04T16:15:00Z", 912 | "overflow": false, 913 | "reserved": false, 914 | "remark": null, 915 | "roomId": 1205, 916 | "roomName": "Room 9", 917 | "sessionTypeId": 1254, 918 | "sessionTypeName": "Tools-in-Action", 919 | "sessionTypeDuration": 30, 920 | "sessionTypeBreak": false, 921 | "audienceLevel": "BEGINNER", 922 | "langName": null, 923 | "timezone": "Europe/Brussels", 924 | "trackId": "1159", 925 | "trackName": "Cloud, Containers & Infrastructure", 926 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png", 927 | "speakers": [ 928 | { 929 | "id": 34151, 930 | "firstName": "Mohammed", 931 | "lastName": "Aboullaite", 932 | "company": "xHUB" 933 | } 934 | ], 935 | "tags": [ 936 | { 937 | "name": "Java" 938 | }, 939 | { 940 | "name": "Containers" 941 | }, 942 | { 943 | "name": "Docker" 944 | } 945 | ], 946 | "talkDescription": "The containers technology revolutionized the way we architect, develop and ship our applications, and brought Java developers closed than ever to \"Write once run anywhere\"! \nHowever, Containers added some layers of abstraction: We have to write a Dockerfile, setup Docker daemon, wait for builds to complete, fix any errors and finally push the image to registry! Wasn't building our favorite packaging formats (jar/war|ear) easier?!\n\nThis TIA, explores what Jib, an open source fast image builder Java library from Google, brought to the table, and how it speeds up development by finely separating the application across multiple layers and incrementally building the image, by inferring what it needs from Maven or Gradle project. We'll also discuss the concept of \"Distroless\" container Images and how to benefit from it.\n", 947 | "talkTitle": "Speedy build for your java application images with JIB!", 948 | "talkId": 33703 949 | }, 950 | { 951 | "id": 115251, 952 | "fromDate": "2019-11-04T15:45:00Z", 953 | "toDate": "2019-11-04T16:15:00Z", 954 | "overflow": false, 955 | "reserved": false, 956 | "remark": null, 957 | "roomId": 1210, 958 | "roomName": "BOF 1", 959 | "sessionTypeId": 1254, 960 | "sessionTypeName": "Tools-in-Action", 961 | "sessionTypeDuration": 30, 962 | "sessionTypeBreak": false, 963 | "audienceLevel": "BEGINNER", 964 | "langName": null, 965 | "timezone": "Europe/Brussels", 966 | "trackId": "1159", 967 | "trackName": "Cloud, Containers & Infrastructure", 968 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png", 969 | "speakers": [ 970 | { 971 | "id": 6852, 972 | "firstName": "Ana-Maria", 973 | "lastName": "Mihalceanu", 974 | "company": "IBM" 975 | } 976 | ], 977 | "tags": [ 978 | { 979 | "name": "release" 980 | }, 981 | { 982 | "name": "Elegant Builds at Scale" 983 | }, 984 | { 985 | "name": "Kubernetes" 986 | }, 987 | { 988 | "name": "Package mangement" 989 | }, 990 | { 991 | "name": "best practices" 992 | } 993 | ], 994 | "talkDescription": "Changes, even those that represent improvement, are always accompanied by obstacles and discomforts. \nKubernetes can become very complex with all the objects that need to be handled in addition to releases that you operate with. The goal of this session: address complexity with development passion. \nIn this session I will explain and demonstrate live how you can simplify Kubernetes complexity with Helm: templates, values, requirements and pod specifications made easier, maintainable and reusable.", 995 | "talkTitle": "Helm your way with Kubernetes", 996 | "talkId": 26303 997 | }, 998 | { 999 | "id": 26953, 1000 | "fromDate": "2019-11-04T16:15:00Z", 1001 | "toDate": "2019-11-04T16:30:00Z", 1002 | "overflow": false, 1003 | "reserved": false, 1004 | "remark": null, 1005 | "roomId": 1203, 1006 | "roomName": "Exhibition Hall", 1007 | "sessionTypeId": 26902, 1008 | "sessionTypeName": "Break", 1009 | "sessionTypeDuration": 15, 1010 | "sessionTypeBreak": true, 1011 | "audienceLevel": null, 1012 | "langName": null, 1013 | "timezone": "Europe/Brussels", 1014 | "trackId": null, 1015 | "trackName": null, 1016 | "trackImageURL": null, 1017 | "speakers": null, 1018 | "tags": null, 1019 | "talkDescription": null, 1020 | "talkTitle": null, 1021 | "talkId": null 1022 | }, 1023 | { 1024 | "id": 26579, 1025 | "fromDate": "2019-11-04T16:30:00Z", 1026 | "toDate": "2019-11-04T17:00:00Z", 1027 | "overflow": false, 1028 | "reserved": false, 1029 | "remark": null, 1030 | "roomId": 1211, 1031 | "roomName": "Room 4", 1032 | "sessionTypeId": 1254, 1033 | "sessionTypeName": "Tools-in-Action", 1034 | "sessionTypeDuration": 30, 1035 | "sessionTypeBreak": false, 1036 | "audienceLevel": "BEGINNER", 1037 | "langName": null, 1038 | "timezone": "Europe/Brussels", 1039 | "trackId": "1160", 1040 | "trackName": "Architecture", 1041 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png", 1042 | "speakers": [ 1043 | { 1044 | "id": 13858, 1045 | "firstName": "Rosanne", 1046 | "lastName": "Joosten", 1047 | "company": "OpenValue" 1048 | } 1049 | ], 1050 | "tags": [ 1051 | { 1052 | "name": "testing" 1053 | }, 1054 | { 1055 | "name": "mocks" 1056 | }, 1057 | { 1058 | "name": "test frameworks" 1059 | } 1060 | ], 1061 | "talkDescription": "Microservices are a popular architectural pattern in the Java world. So developers have to learn to deal with this architecture and the accompanying benefits and pitfalls. Take testing microservices. One of the main benefits of a microservice is that it has its own isolated responsibility. You can develop, upgrade, scale and test them independently. But microservices often depend on other services. So when you want to test the application, the question arises: which services you should start. How do you stabilise tests for a single service without bothering about its dependencies? Wiremock can help you with that. WireMock is a simulator for HTTP-based APIs. In this session the use of Wiremock in a real-life application is discussed and demonstrated.", 1062 | "talkTitle": "Wiremock: because your microservice needs a buddy when you're testing", 1063 | "talkId": 13912 1064 | }, 1065 | { 1066 | "id": 26578, 1067 | "fromDate": "2019-11-04T16:30:00Z", 1068 | "toDate": "2019-11-04T17:00:00Z", 1069 | "overflow": false, 1070 | "reserved": false, 1071 | "remark": null, 1072 | "roomId": 1202, 1073 | "roomName": "Room 5", 1074 | "sessionTypeId": 1254, 1075 | "sessionTypeName": "Tools-in-Action", 1076 | "sessionTypeDuration": 30, 1077 | "sessionTypeBreak": false, 1078 | "audienceLevel": "BEGINNER", 1079 | "langName": null, 1080 | "timezone": "Europe/Brussels", 1081 | "trackId": "1154", 1082 | "trackName": "Java Language", 1083 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 1084 | "speakers": [ 1085 | { 1086 | "id": 45707, 1087 | "firstName": "Robert", 1088 | "lastName": "Munteanu", 1089 | "company": "Adobe Systems" 1090 | } 1091 | ], 1092 | "tags": [ 1093 | { 1094 | "name": "Java" 1095 | }, 1096 | { 1097 | "name": "javaagent" 1098 | }, 1099 | { 1100 | "name": "best practices" 1101 | } 1102 | ], 1103 | "talkDescription": "Java agents are a little-known but extremely powerful part of the Java ecosystem. Agents are able to transform existing classes at runtime, allowing scenarios such as logging and monitoring, hot reload or gathering code coverage. However, their usage presents a number of pitfalls as well.\n\nIn this talk we will present the steps of writing a java agent from scratch, indicate various common mistakes and pain points and draw conclusions on best practices.\n\nAfter this talk participants will have a better understanding of the Java instrumentation API and about should / should not be done with it.", 1104 | "talkTitle": "Writing Java agents for fun and (not so much) profit", 1105 | "talkId": 45459 1106 | }, 1107 | { 1108 | "id": 26577, 1109 | "fromDate": "2019-11-04T16:30:00Z", 1110 | "toDate": "2019-11-04T17:00:00Z", 1111 | "overflow": false, 1112 | "reserved": false, 1113 | "remark": null, 1114 | "roomId": 1207, 1115 | "roomName": "Room 6", 1116 | "sessionTypeId": 1254, 1117 | "sessionTypeName": "Tools-in-Action", 1118 | "sessionTypeDuration": 30, 1119 | "sessionTypeBreak": false, 1120 | "audienceLevel": "BEGINNER", 1121 | "langName": null, 1122 | "timezone": "Europe/Brussels", 1123 | "trackId": "1157", 1124 | "trackName": "Front End", 1125 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e8f80f6a-89da-49e9-993c-bc94be9ca14b.png", 1126 | "speakers": [ 1127 | { 1128 | "id": 50810, 1129 | "firstName": "Vincent", 1130 | "lastName": "Ogloblinsky", 1131 | "company": "SII" 1132 | } 1133 | ], 1134 | "tags": [ 1135 | { 1136 | "name": "Augmented Reality" 1137 | }, 1138 | { 1139 | "name": "web browser" 1140 | }, 1141 | { 1142 | "name": "Web API" 1143 | } 1144 | ], 1145 | "talkDescription": "After virtual reality & augmented reality, here is the third : mixed reality. In this fusion of real and virtual world, mixed reality adds objects in our real environment which user can interact with.\n\nWebXR in an official API draft from Mozilla & Google to extend WebVR API for augmented reality, with support of frameworks like ARKit (Apple) et ARCore (Google).\n\nIn this talk, discover in details this new API & how we can build right now with web languages such interactive web experiences.", 1146 | "talkTitle": "WebXR : augmented reality lands into our web browsers", 1147 | "talkId": 50324 1148 | }, 1149 | { 1150 | "id": 26576, 1151 | "fromDate": "2019-11-04T16:30:00Z", 1152 | "toDate": "2019-11-04T17:00:00Z", 1153 | "overflow": false, 1154 | "reserved": false, 1155 | "remark": null, 1156 | "roomId": 1201, 1157 | "roomName": "Room 8", 1158 | "sessionTypeId": 1254, 1159 | "sessionTypeName": "Tools-in-Action", 1160 | "sessionTypeDuration": 30, 1161 | "sessionTypeBreak": false, 1162 | "audienceLevel": "BEGINNER", 1163 | "langName": null, 1164 | "timezone": "Europe/Brussels", 1165 | "trackId": "1152", 1166 | "trackName": "Programming languages", 1167 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/53f80769-d8be-4ae5-a731-d5591c97d2b4.png", 1168 | "speakers": [ 1169 | { 1170 | "id": 50552, 1171 | "firstName": "Robert", 1172 | "lastName": "Scholte", 1173 | "company": "Sourcegrounds" 1174 | } 1175 | ], 1176 | "tags": [ 1177 | { 1178 | "name": "Java" 1179 | }, 1180 | { 1181 | "name": "build tools" 1182 | }, 1183 | { 1184 | "name": "Apache Maven" 1185 | } 1186 | ], 1187 | "talkDescription": "\"Why is my build broken? Again?\" We all recognize the frustrations when things are not going as planned. Software development just isn't that easy. But how do we solve the issue? In case you have full control over the problem, you'll be able to fix it yourself, hopefully. But in case you depend on something or somebody else it often results in temporary workarounds, in theory. In practice nothing is as permanent as a temporary solution. Over the last decade Maven has improved a lot, but still only a small percentage of the available features are used by the average developer. \nThis session demonstates the evolution of Maven based on user experiences and explaining the proper solution for workarounds like \"clean install\".", 1188 | "talkTitle": "Broken Buildtools and Bad Behaviors; The Maven Story", 1189 | "talkId": 50258 1190 | }, 1191 | { 1192 | "id": 26580, 1193 | "fromDate": "2019-11-04T16:30:00Z", 1194 | "toDate": "2019-11-04T17:00:00Z", 1195 | "overflow": false, 1196 | "reserved": false, 1197 | "remark": null, 1198 | "roomId": 1205, 1199 | "roomName": "Room 9", 1200 | "sessionTypeId": 1254, 1201 | "sessionTypeName": "Tools-in-Action", 1202 | "sessionTypeDuration": 30, 1203 | "sessionTypeBreak": false, 1204 | "audienceLevel": "BEGINNER", 1205 | "langName": null, 1206 | "timezone": "Europe/Brussels", 1207 | "trackId": "1159", 1208 | "trackName": "Cloud, Containers & Infrastructure", 1209 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png", 1210 | "speakers": [ 1211 | { 1212 | "id": 50806, 1213 | "firstName": "Fabian", 1214 | "lastName": "Stäber", 1215 | "company": "Instana" 1216 | } 1217 | ], 1218 | "tags": [ 1219 | { 1220 | "name": "Java" 1221 | }, 1222 | { 1223 | "name": "Kubernetes" 1224 | }, 1225 | { 1226 | "name": "Quarkus" 1227 | } 1228 | ], 1229 | "talkDescription": "Kubernetes is much more than a runtime platform for Docker containers. Its API can be extended with application-specific custom resource definitions (CRDs), and you can implement your own controllers adapting your applications dynamically to changes in the cluster. Application-specific custom controllers are called \"operators\". Until recently, most operators were written in Go, re-using code from the built-in Kubernetes controllers. With Quarkus and the fabric8 Kubernetes Client we now have a great basis for implementing operators in Java, allowing us to integrate our existing code base with the power of Kubernetes API extensions. At Instana, we used these new technologies to implement our instana-agent-operator. In this presentation, we will provide an experience report and lessons learned from implementing our own operator in Java. The operator is available on https://github.com/instana/instana-agent-operator.", 1230 | "talkTitle": "Writing a Kubernetes Operator in Java", 1231 | "talkId": 50318 1232 | }, 1233 | { 1234 | "id": 26955, 1235 | "fromDate": "2019-11-04T17:00:00Z", 1236 | "toDate": "2019-11-04T17:15:00Z", 1237 | "overflow": false, 1238 | "reserved": false, 1239 | "remark": null, 1240 | "roomId": 1203, 1241 | "roomName": "Exhibition Hall", 1242 | "sessionTypeId": 26902, 1243 | "sessionTypeName": "Break", 1244 | "sessionTypeDuration": 15, 1245 | "sessionTypeBreak": true, 1246 | "audienceLevel": null, 1247 | "langName": null, 1248 | "timezone": "Europe/Brussels", 1249 | "trackId": null, 1250 | "trackName": null, 1251 | "trackImageURL": null, 1252 | "speakers": null, 1253 | "tags": null, 1254 | "talkDescription": null, 1255 | "talkTitle": null, 1256 | "talkId": null 1257 | }, 1258 | { 1259 | "id": 26581, 1260 | "fromDate": "2019-11-04T17:15:00Z", 1261 | "toDate": "2019-11-04T17:45:00Z", 1262 | "overflow": false, 1263 | "reserved": false, 1264 | "remark": null, 1265 | "roomId": 1211, 1266 | "roomName": "Room 4", 1267 | "sessionTypeId": 1254, 1268 | "sessionTypeName": "Tools-in-Action", 1269 | "sessionTypeDuration": 30, 1270 | "sessionTypeBreak": false, 1271 | "audienceLevel": "BEGINNER", 1272 | "langName": null, 1273 | "timezone": "Europe/Brussels", 1274 | "trackId": "1160", 1275 | "trackName": "Architecture", 1276 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/17c5c96d-cbfd-42ef-b715-13f1a05c5391.png", 1277 | "speakers": [ 1278 | { 1279 | "id": 50596, 1280 | "firstName": "Loïc", 1281 | "lastName": "MATHIEU", 1282 | "company": "Zenika" 1283 | } 1284 | ], 1285 | "tags": [ 1286 | { 1287 | "name": "Java" 1288 | }, 1289 | { 1290 | "name": "monitoring" 1291 | }, 1292 | { 1293 | "name": "debugging" 1294 | } 1295 | ], 1296 | "talkDescription": "Alibaba is the Chinese colossus of the e-commerce, they just open-sourced a few months ago Arthas, a diagnostic tool for the JVM, which they use in production for find and solves issues (performance, crash, ...).\nIn this tools-in-action, comes and discover how Arthas works via a live-session where we will diagnose the behavior of a Java application.\nYou will see the Arthas CLI in action to find, diagnose, debug and solves coding issues and discover performance bottlenecks.", 1297 | "talkTitle": "Arthas - Alibaba Java Diagnostic Tool", 1298 | "talkId": 51439 1299 | }, 1300 | { 1301 | "id": 26584, 1302 | "fromDate": "2019-11-04T17:15:00Z", 1303 | "toDate": "2019-11-04T17:45:00Z", 1304 | "overflow": false, 1305 | "reserved": false, 1306 | "remark": null, 1307 | "roomId": 1202, 1308 | "roomName": "Room 5", 1309 | "sessionTypeId": 1254, 1310 | "sessionTypeName": "Tools-in-Action", 1311 | "sessionTypeDuration": 30, 1312 | "sessionTypeBreak": false, 1313 | "audienceLevel": "BEGINNER", 1314 | "langName": null, 1315 | "timezone": "Europe/Brussels", 1316 | "trackId": "1154", 1317 | "trackName": "Java Language", 1318 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/f63a6ff7-0b15-4feb-b0fb-06aad848e601.png", 1319 | "speakers": [ 1320 | { 1321 | "id": 44405, 1322 | "firstName": "Werner", 1323 | "lastName": "Keil", 1324 | "company": "Creative Arts & Technologies Ltd&Co KG" 1325 | } 1326 | ], 1327 | "tags": [ 1328 | { 1329 | "name": "Java" 1330 | }, 1331 | { 1332 | "name": "JSR" 1333 | }, 1334 | { 1335 | "name": "JSR 354 - The Money & Currency API" 1336 | }, 1337 | { 1338 | "name": "JCP" 1339 | }, 1340 | { 1341 | "name": "money" 1342 | } 1343 | ], 1344 | "talkDescription": "Maintenance Lead Werner Keil will present JSR 354 (Money and Currency). They will discuss the API from a developer as well as user perspective and share details on the design decisions behind the JSR. \nMonetary values are a key feature of many applications, yet the JDK provides little or no support. The existing java.util.Currency class is strictly a structure used for representing current ISO-4217 currencies, but not associated values or custom currencies. The JDK also provides no support for monetary arithmetic or currency conversion, nor for a standard value type to represent a monetary amount. \nThe session will demonstrate how the JSR models monetary capabilities, monetary amounts, currencies, rounding, financial arithmetics as well as formatting and currency conversion in a platform independent and flexible manner. The first part of the talk will focus on key concepts, improvements like Java 9/Jigsaw modularity and planned new features for a future release followed by a live coding session demonstrating the Money JSR in action.", 1345 | "talkTitle": "Money, Money, Money, can be funny with JSR 354", 1346 | "talkId": 52086 1347 | }, 1348 | { 1349 | "id": 26585, 1350 | "fromDate": "2019-11-04T17:15:00Z", 1351 | "toDate": "2019-11-04T17:45:00Z", 1352 | "overflow": false, 1353 | "reserved": false, 1354 | "remark": null, 1355 | "roomId": 1207, 1356 | "roomName": "Room 6", 1357 | "sessionTypeId": 1254, 1358 | "sessionTypeName": "Tools-in-Action", 1359 | "sessionTypeDuration": 30, 1360 | "sessionTypeBreak": false, 1361 | "audienceLevel": "BEGINNER", 1362 | "langName": null, 1363 | "timezone": "Europe/Brussels", 1364 | "trackId": "1153", 1365 | "trackName": "Big Data & Machine Learning", 1366 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/e80e14f1-7a23-4a6d-a955-7a653973f6eb.png", 1367 | "speakers": [ 1368 | { 1369 | "id": 46501, 1370 | "firstName": "Quentin", 1371 | "lastName": "Ambard", 1372 | "company": "Databricks" 1373 | } 1374 | ], 1375 | "tags": [ 1376 | { 1377 | "name": "Cloud Machine Learning" 1378 | }, 1379 | { 1380 | "name": "Cloud Ecosystems" 1381 | }, 1382 | { 1383 | "name": "Machine learning" 1384 | } 1385 | ], 1386 | "talkDescription": "Machine learning development brings many new complexities beyond the traditional software development lifecycle. ML developers want to try multiple algorithms, tools and parameters to get the best results, and they need to track this information to ensure reproducibility, especially when it comes to deploy these models in production!\nJoin the session to discover how the MLflow open source platform can help you to:\n\n- Keep track of experiments runs and results across frameworks.\n- Register projects and quickly reproduce your runs.\n- Quickly productionize models using Docker containers, Azure ML, or Amazon SageMaker", 1387 | "talkTitle": "MLflow: Platform for Complete Machine Learning Lifecycle", 1388 | "talkId": 51739 1389 | }, 1390 | { 1391 | "id": 26582, 1392 | "fromDate": "2019-11-04T17:15:00Z", 1393 | "toDate": "2019-11-04T17:45:00Z", 1394 | "overflow": false, 1395 | "reserved": false, 1396 | "remark": null, 1397 | "roomId": 1201, 1398 | "roomName": "Room 8", 1399 | "sessionTypeId": 1254, 1400 | "sessionTypeName": "Tools-in-Action", 1401 | "sessionTypeDuration": 30, 1402 | "sessionTypeBreak": false, 1403 | "audienceLevel": "BEGINNER", 1404 | "langName": null, 1405 | "timezone": "Europe/Brussels", 1406 | "trackId": "1155", 1407 | "trackName": "Server Side Java", 1408 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/698b503d-9578-48da-85a9-bdf8ba942e3a.png", 1409 | "speakers": [ 1410 | { 1411 | "id": 14051, 1412 | "firstName": "Jesper", 1413 | "lastName": "Møller", 1414 | "company": "Nine A/S" 1415 | } 1416 | ], 1417 | "tags": [ 1418 | { 1419 | "name": "RxJava" 1420 | }, 1421 | { 1422 | "name": "Javascript" 1423 | }, 1424 | { 1425 | "name": "Apache Kafka" 1426 | }, 1427 | { 1428 | "name": "Micronaut" 1429 | }, 1430 | { 1431 | "name": "Reactive Streams" 1432 | } 1433 | ], 1434 | "talkDescription": "This live code walkthrough will show you how to accept data get from a screaming hot data source, tame it into topic-based storage, and finally extract it into an interactive, \"live\" web client. In a proper, testable fashion!\n\nWe'll cover the basics of a reactive application in Micronaut, including how to get data in and out of Apache Kafka, by leveraging Micronaut's novel approach to dependency injection. We'll put the streams of data to good use in an interactive client using D3.js, using just enough JavaScript code.\n\nAnd we'll do it while enjoying the short iteration times and static type safety guaranteed by Micronaut.", 1435 | "talkTitle": "From hot data sources to interactive clients in a hurry", 1436 | "talkId": 13603 1437 | }, 1438 | { 1439 | "id": 26583, 1440 | "fromDate": "2019-11-04T17:15:00Z", 1441 | "toDate": "2019-11-04T17:45:00Z", 1442 | "overflow": false, 1443 | "reserved": false, 1444 | "remark": null, 1445 | "roomId": 1205, 1446 | "roomName": "Room 9", 1447 | "sessionTypeId": 1254, 1448 | "sessionTypeName": "Tools-in-Action", 1449 | "sessionTypeDuration": 30, 1450 | "sessionTypeBreak": false, 1451 | "audienceLevel": "BEGINNER", 1452 | "langName": null, 1453 | "timezone": "Europe/Brussels", 1454 | "trackId": "1159", 1455 | "trackName": "Cloud, Containers & Infrastructure", 1456 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/227114b5-6c72-4059-82ef-be9bf00ddd47.png", 1457 | "speakers": [ 1458 | { 1459 | "id": 14052, 1460 | "firstName": "Jaap", 1461 | "lastName": "Coomans", 1462 | "company": "GROUP9" 1463 | } 1464 | ], 1465 | "tags": [ 1466 | { 1467 | "name": "MicroServices" 1468 | }, 1469 | { 1470 | "name": "testing" 1471 | }, 1472 | { 1473 | "name": "automation" 1474 | }, 1475 | { 1476 | "name": "mocks" 1477 | } 1478 | ], 1479 | "talkDescription": "How can I test my microservices? It's an often heard question that leads to a lot of debate. Deployment and interdependence with other services are the challenges we're facing there. So, what if we could treat our microservices tests just like our familiar unit tests? What if we could isolate the microservice and mock all its dependencies? With mock-server you can do just that. Mock-server lets you mock any http service, making you independent of other teams building those services. And the best part is, you can use it with the tools you already know like JUnit, Maven and Docker and do all the things you already know from your favorite Java mocking framework. You can run mock-server locally, as part of your Maven build or as a Docker image in your cloud environment. In this session I will show you exactly how you can use mock-server for your tests.", 1480 | "talkTitle": "Mocking your microservices with mock-server", 1481 | "talkId": 13606 1482 | }, 1483 | { 1484 | "id": 26957, 1485 | "fromDate": "2019-11-04T17:45:00Z", 1486 | "toDate": "2019-11-04T18:00:00Z", 1487 | "overflow": false, 1488 | "reserved": false, 1489 | "remark": null, 1490 | "roomId": 1203, 1491 | "roomName": "Exhibition Hall", 1492 | "sessionTypeId": 26902, 1493 | "sessionTypeName": "Break", 1494 | "sessionTypeDuration": 15, 1495 | "sessionTypeBreak": true, 1496 | "audienceLevel": null, 1497 | "langName": null, 1498 | "timezone": "Europe/Brussels", 1499 | "trackId": null, 1500 | "trackName": null, 1501 | "trackImageURL": null, 1502 | "speakers": null, 1503 | "tags": null, 1504 | "talkDescription": null, 1505 | "talkTitle": null, 1506 | "talkId": null 1507 | }, 1508 | { 1509 | "id": 26587, 1510 | "fromDate": "2019-11-04T18:00:00Z", 1511 | "toDate": "2019-11-04T19:00:00Z", 1512 | "overflow": false, 1513 | "reserved": false, 1514 | "remark": null, 1515 | "roomId": 1210, 1516 | "roomName": "BOF 1", 1517 | "sessionTypeId": 1252, 1518 | "sessionTypeName": "BOF", 1519 | "sessionTypeDuration": 60, 1520 | "sessionTypeBreak": false, 1521 | "audienceLevel": "BEGINNER", 1522 | "langName": null, 1523 | "timezone": "Europe/Brussels", 1524 | "trackId": "1158", 1525 | "trackName": "Mind the Geek", 1526 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/0bac192f-aa3c-4288-bad0-4dd4abdbbdc1.png", 1527 | "speakers": [ 1528 | { 1529 | "id": 17453, 1530 | "firstName": "Martin", 1531 | "lastName": "Klähn", 1532 | "company": "Airbus Defence and Space GmbH" 1533 | }, 1534 | { 1535 | "id": 17303, 1536 | "firstName": "Sven", 1537 | "lastName": "Reimers", 1538 | "company": "Java Champion" 1539 | } 1540 | ], 1541 | "tags": [ 1542 | { 1543 | "name": "Java Community" 1544 | }, 1545 | { 1546 | "name": "JavaFX" 1547 | }, 1548 | { 1549 | "name": "Tweetwall" 1550 | } 1551 | ], 1552 | "talkDescription": "TweetwallFX - entertaining thousands of Devoxxians for 5 years - time to look back to where we started, chat about the achievements, e.g. AI, exchanging tips and tricks against hijacking of hashtags, creating layers of self protections and so much more.. Let's talk about using TweetwallFX for your conference (includes CFP rendering) and even some fun about embedded - did I mention TweetwallFX can be run a RaspberryPi? Maybe we can even make it run on GraalVM? Bring your own ideas on how TweetwallFX can be further improved - we are always open to crazy suggestions... Ask Stephan...", 1553 | "talkTitle": "TweetWalls@Devoxx - Today, Tomorrow and Beyond - A Community Get Together", 1554 | "talkId": 17555 1555 | }, 1556 | { 1557 | "id": 26586, 1558 | "fromDate": "2019-11-04T18:00:00Z", 1559 | "toDate": "2019-11-04T19:00:00Z", 1560 | "overflow": false, 1561 | "reserved": false, 1562 | "remark": null, 1563 | "roomId": 1206, 1564 | "roomName": "BOF 2", 1565 | "sessionTypeId": 1252, 1566 | "sessionTypeName": "BOF", 1567 | "sessionTypeDuration": 60, 1568 | "sessionTypeBreak": false, 1569 | "audienceLevel": "BEGINNER", 1570 | "langName": null, 1571 | "timezone": "Europe/Brussels", 1572 | "trackId": "1151", 1573 | "trackName": "Methodology & Culture", 1574 | "trackImageURL": "https://s3-eu-west-1.amazonaws.com/voxxeddays/webapp/images/710ace39-49e0-4935-9734-7cda98204fa4.png", 1575 | "speakers": [ 1576 | { 1577 | "id": 50570, 1578 | "firstName": "Steve", 1579 | "lastName": "Poole", 1580 | "company": "IBM" 1581 | } 1582 | ], 1583 | "tags": [ 1584 | { 1585 | "name": "Java" 1586 | }, 1587 | { 1588 | "name": "devops" 1589 | }, 1590 | { 1591 | "name": "fun" 1592 | }, 1593 | { 1594 | "name": "Kubernetes" 1595 | } 1596 | ], 1597 | "talkDescription": "In my day being a developer was easy. Just you. Java and your monolith.\nModern developers have no idea how unlucky they are.\n\n\nThis talk is a sideways walk through a serious topic. The amount of ancillary knowledge that developers nowadays need is truly\namazing. Trying to deliver you precious business logic is challenging when it seems you also need a degree in Kubernetes and DevOps tools.\n\nWhich way should you go on your journey? what tools?, what companions do you need with you? Everything keeps changing which makes\nIt easy to go down an undiscovered path and find yourself being chased by natives with blowpipes and large spherical rocks.\n\nLaying out the current landscape of tools and approaches this session will (re) introduce you to old enemies and new friends alike and help you understand where you need to put your trust \nand when to run away (at least for today) \n\nBut you know, try to tell the youngsters how easy it could be and they just don’t believe you.", 1598 | "talkTitle": "Monty Python meets the Cloud of Doom", 1599 | "talkId": 52055 1600 | } 1601 | ] --------------------------------------------------------------------------------