From 27a3c24121d74e7f0e4fbceafc30789cc62f8aba Mon Sep 17 00:00:00 2001 From: Benjamin Schmid Date: Thu, 30 Jun 2016 22:17:59 +0200 Subject: [PATCH] feat(*): add ligning talk with example code --- .gitignore | 6 +- .idea/compiler.xml | 11 + .idea/encodings.xml | 1 + .idea/misc.xml | 46 +- .idea/modules.xml | 1 + java9-in-action.iml | 1 - playground-dependent/playground-dependent.iml | 12 + playground-dependent/run-with-modules | 12 + .../anothermodule/RetrieveModuleInfo.java | 40 + .../anothermodule/TestJigsawSPI.java | 12 + .../TestModuleEncapuslation.java | 17 + .../exxcellent/anothermodule/module-info.java | 8 + .../spi/MastercardBillingService.java | 11 + .../spi/MastercardBillingServiceProvider.java | 12 + playground/playground.iml | 8 +- playground/src/main/java/.placeholder | 0 .../collections/ImmutableCollections.java | 31 + .../java9/http/HttpClientExample.java | 25 + .../java9/jigsaw/BillingService.java | 28 + .../jigsaw/spi/BillingServiceProvider.java | 8 + .../java/de/exxcellent/java9/module-info.java | 12 + .../java9/process/ControlProcess.java | 44 + .../java9/util/InputStreamExample.java | 17 + .../java9/util/StackWalkerExample.java | 22 + presentation/css/custom.css | 44 +- presentation/index.html | 883 +++++++++++------- 26 files changed, 920 insertions(+), 392 deletions(-) create mode 100644 playground-dependent/playground-dependent.iml create mode 100755 playground-dependent/run-with-modules create mode 100644 playground-dependent/src/main/java/de/exxcellent/anothermodule/RetrieveModuleInfo.java create mode 100644 playground-dependent/src/main/java/de/exxcellent/anothermodule/TestJigsawSPI.java create mode 100644 playground-dependent/src/main/java/de/exxcellent/anothermodule/TestModuleEncapuslation.java create mode 100644 playground-dependent/src/main/java/de/exxcellent/anothermodule/module-info.java create mode 100644 playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingService.java create mode 100644 playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingServiceProvider.java delete mode 100644 playground/src/main/java/.placeholder create mode 100644 playground/src/main/java/de/exxcellent/java9/collections/ImmutableCollections.java create mode 100644 playground/src/main/java/de/exxcellent/java9/http/HttpClientExample.java create mode 100644 playground/src/main/java/de/exxcellent/java9/jigsaw/BillingService.java create mode 100644 playground/src/main/java/de/exxcellent/java9/jigsaw/spi/BillingServiceProvider.java create mode 100644 playground/src/main/java/de/exxcellent/java9/module-info.java create mode 100644 playground/src/main/java/de/exxcellent/java9/process/ControlProcess.java create mode 100644 playground/src/main/java/de/exxcellent/java9/util/InputStreamExample.java create mode 100644 playground/src/main/java/de/exxcellent/java9/util/StackWalkerExample.java diff --git a/.gitignore b/.gitignore index 13b1406..cb07a61 100644 --- a/.gitignore +++ b/.gitignore @@ -39,9 +39,5 @@ # JIRA plugin atlassian-ide-plugin.xml -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties +target/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml index a852314..f65b71b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -18,6 +18,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 97626ba..2e2ae6a 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,7 @@ + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 7ef8c38..794ffe8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,20 +1,32 @@ - - - - - - - - - - - Ant inspections - - - - + + + + + + + @@ -26,7 +38,7 @@ - - + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 471c159..b30747c 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + \ No newline at end of file diff --git a/java9-in-action.iml b/java9-in-action.iml index de59fc9..0846814 100644 --- a/java9-in-action.iml +++ b/java9-in-action.iml @@ -3,7 +3,6 @@ - diff --git a/playground-dependent/playground-dependent.iml b/playground-dependent/playground-dependent.iml new file mode 100644 index 0000000..95801f8 --- /dev/null +++ b/playground-dependent/playground-dependent.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/playground-dependent/run-with-modules b/playground-dependent/run-with-modules new file mode 100755 index 0000000..6b5797e --- /dev/null +++ b/playground-dependent/run-with-modules @@ -0,0 +1,12 @@ +#!/bin/bash + +echo -e "\nHINT: Be sure to compile project with IDEA first\n" + +echo -e "=== RetrieveModuleInfo" +java -modulepath ../target/production/playground:../target/production/playground-dependent \ + -m anothermodule/de.exxcellent.anothermodule.RetrieveModuleInfo + + +echo -e "\n\n=== TestJigsawSPI" +java -modulepath ../target/production/playground:../target/production/playground-dependent \ + -m anothermodule/de.exxcellent.anothermodule.TestJigsawSPI diff --git a/playground-dependent/src/main/java/de/exxcellent/anothermodule/RetrieveModuleInfo.java b/playground-dependent/src/main/java/de/exxcellent/anothermodule/RetrieveModuleInfo.java new file mode 100644 index 0000000..be0eb40 --- /dev/null +++ b/playground-dependent/src/main/java/de/exxcellent/anothermodule/RetrieveModuleInfo.java @@ -0,0 +1,40 @@ +package de.exxcellent.anothermodule; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.module.ModuleDescriptor; +import static java.lang.System.out; + +public class RetrieveModuleInfo { + + /** + * Show module infos + */ + public static void main(String[] args) throws IOException { + ModuleDescriptor descriptor = RetrieveModuleInfo.class.getModule().getDescriptor(); + + if (descriptor == null) { + out.println("JVM started without '-mp' option. Trying to load module-info manually..."); + descriptor = readModuleDescriptorFromBytecode(); + } + + printModule(descriptor); + } + + static void printModule(ModuleDescriptor descriptor) { + out.println("Module " + descriptor.name()); + descriptor.exports().forEach( + export -> out.println("\texports " + export.source()) + ); + descriptor.requires().forEach( + requires -> out.println("\trequires " + requires.name() + " " + requires.modifiers()) + ); + } + + static ModuleDescriptor readModuleDescriptorFromBytecode() throws IOException { + InputStream moduleInfo = RetrieveModuleInfo.class.getClassLoader().getResourceAsStream("module-info.class"); + return ModuleDescriptor.read(moduleInfo); + } + + +} \ No newline at end of file diff --git a/playground-dependent/src/main/java/de/exxcellent/anothermodule/TestJigsawSPI.java b/playground-dependent/src/main/java/de/exxcellent/anothermodule/TestJigsawSPI.java new file mode 100644 index 0000000..2d82108 --- /dev/null +++ b/playground-dependent/src/main/java/de/exxcellent/anothermodule/TestJigsawSPI.java @@ -0,0 +1,12 @@ +package de.exxcellent.anothermodule; + +import de.exxcellent.java9.jigsaw.BillingService; +import static java.lang.System.out; + +public class TestJigsawSPI { + + public static void main(String[] args) { + BillingService s = BillingService.getInstance(); + out.println(s.takeMoney()); + } +} \ No newline at end of file diff --git a/playground-dependent/src/main/java/de/exxcellent/anothermodule/TestModuleEncapuslation.java b/playground-dependent/src/main/java/de/exxcellent/anothermodule/TestModuleEncapuslation.java new file mode 100644 index 0000000..5401708 --- /dev/null +++ b/playground-dependent/src/main/java/de/exxcellent/anothermodule/TestModuleEncapuslation.java @@ -0,0 +1,17 @@ +package de.exxcellent.anothermodule; + +import de.exxcellent.java9.collections.ImmutableCollections; + +/** + * Test module encapsulation + */ +public class TestModuleEncapuslation { + + public static void main(String[] args) { + ImmutableCollections.main(args); + + // Would break, as it is not exported. Though it's public! + // de.exxcellent.java9.util.InputStreamExample.main(args); + } + +} diff --git a/playground-dependent/src/main/java/de/exxcellent/anothermodule/module-info.java b/playground-dependent/src/main/java/de/exxcellent/anothermodule/module-info.java new file mode 100644 index 0000000..f39e5e1 --- /dev/null +++ b/playground-dependent/src/main/java/de/exxcellent/anothermodule/module-info.java @@ -0,0 +1,8 @@ +module anothermodule { + exports de.exxcellent.anothermodule; + requires de.exxcellent.java9; + + // Provide Service instance (SPI with Jigsaw modules) + provides de.exxcellent.java9.jigsaw.spi.BillingServiceProvider + with de.exxcellent.anothermodule.spi.MastercardBillingServiceProvider; +} \ No newline at end of file diff --git a/playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingService.java b/playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingService.java new file mode 100644 index 0000000..417f82e --- /dev/null +++ b/playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingService.java @@ -0,0 +1,11 @@ +package de.exxcellent.anothermodule.spi; + +import de.exxcellent.java9.jigsaw.BillingService; + +class MastercardBillingService extends BillingService { + + @Override + public String takeMoney() { + return "Mastercard billed the money!"; + } +} \ No newline at end of file diff --git a/playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingServiceProvider.java b/playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingServiceProvider.java new file mode 100644 index 0000000..2044b34 --- /dev/null +++ b/playground-dependent/src/main/java/de/exxcellent/anothermodule/spi/MastercardBillingServiceProvider.java @@ -0,0 +1,12 @@ +package de.exxcellent.anothermodule.spi; + +import de.exxcellent.java9.jigsaw.BillingService; +import de.exxcellent.java9.jigsaw.spi.BillingServiceProvider; + +public class MastercardBillingServiceProvider extends BillingServiceProvider { + + @Override + public BillingService buildBillingService() { + return new MastercardBillingService(); + } +} \ No newline at end of file diff --git a/playground/playground.iml b/playground/playground.iml index c90834f..387d89f 100644 --- a/playground/playground.iml +++ b/playground/playground.iml @@ -1,9 +1,9 @@ - - - + + - + + diff --git a/playground/src/main/java/.placeholder b/playground/src/main/java/.placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/playground/src/main/java/de/exxcellent/java9/collections/ImmutableCollections.java b/playground/src/main/java/de/exxcellent/java9/collections/ImmutableCollections.java new file mode 100644 index 0000000..fc8eec8 --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/collections/ImmutableCollections.java @@ -0,0 +1,31 @@ +package de.exxcellent.java9.collections; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import static java.lang.System.*; + +public class ImmutableCollections { + + /** + * Create immutable collections on the fly. + * They do not accept {@code null} or duplicate entries (Set/Map) + */ + public static void main(String args[]) { + List listOfNumbers = List.of(1, 2, 3, 4, 5/*, null*/); + out.println(listOfNumbers); + + Set setOfNumbers = Set.of(1, 2, 3, 4, 5/*, 1*/); + out.println(setOfNumbers); + + Map mapOfString = Map.of("key1", "value1", "key2", "value2"); + out.println(mapOfString); + + Map moreMapOfString = Map.ofEntries( + Map.entry("key1", "value1"), + Map.entry("key2", "value2")/*, + Map.entry("key1", "value3")*/ + ); + out.println(moreMapOfString); + } +} \ No newline at end of file diff --git a/playground/src/main/java/de/exxcellent/java9/http/HttpClientExample.java b/playground/src/main/java/de/exxcellent/java9/http/HttpClientExample.java new file mode 100644 index 0000000..0a71869 --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/http/HttpClientExample.java @@ -0,0 +1,25 @@ +package de.exxcellent.java9.http; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpResponse; +import static java.lang.System.out; + +public class HttpClientExample { + + /** + * The HTTP API functions asynchronously & synchronously. In asynchronous mode, + * work is done on the threads supplied by the client's ExecutorService. + */ + public static void main(String[] args) throws Exception{ + HttpClient.getDefault() + .request(URI.create("https://www.exxcellent.de")) + .GET() + .responseAsync() // CompletableFuture :D + .thenAccept(httpResponse -> + out.println(httpResponse.body(HttpResponse.asString())) + ); + + Thread.sleep(999); // Give worker thread some time. + } +} \ No newline at end of file diff --git a/playground/src/main/java/de/exxcellent/java9/jigsaw/BillingService.java b/playground/src/main/java/de/exxcellent/java9/jigsaw/BillingService.java new file mode 100644 index 0000000..b7fc2ab --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/jigsaw/BillingService.java @@ -0,0 +1,28 @@ +package de.exxcellent.java9.jigsaw; + +import java.util.Iterator; +import java.util.ServiceLoader; +import de.exxcellent.java9.jigsaw.spi.BillingServiceProvider; + +public abstract class BillingService { + + protected BillingService() { + } + + public static BillingService getInstance() { + // Java SPI to find the instance + ServiceLoader sl = ServiceLoader.load(BillingServiceProvider.class); + + // Fetch first provider implementation + Iterator providerIterator = sl.iterator(); + if (!providerIterator.hasNext()) { + throw new RuntimeException("No service providers found!"); + } + + BillingServiceProvider provider = providerIterator.next(); + + return provider.buildBillingService(); + } + + public abstract String takeMoney(); +} diff --git a/playground/src/main/java/de/exxcellent/java9/jigsaw/spi/BillingServiceProvider.java b/playground/src/main/java/de/exxcellent/java9/jigsaw/spi/BillingServiceProvider.java new file mode 100644 index 0000000..c6bb931 --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/jigsaw/spi/BillingServiceProvider.java @@ -0,0 +1,8 @@ +package de.exxcellent.java9.jigsaw.spi; + +import de.exxcellent.java9.jigsaw.BillingService; + +public abstract class BillingServiceProvider { + + public abstract BillingService buildBillingService(); +} \ No newline at end of file diff --git a/playground/src/main/java/de/exxcellent/java9/module-info.java b/playground/src/main/java/de/exxcellent/java9/module-info.java new file mode 100644 index 0000000..280e5e7 --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/module-info.java @@ -0,0 +1,12 @@ +module de.exxcellent.java9 { + exports de.exxcellent.java9.collections; + + // Depend on an offficial JDK modules + // full list see http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html + requires java.httpclient; + + // Service example (SPI with Jigsaw modules) + exports de.exxcellent.java9.jigsaw; + exports de.exxcellent.java9.jigsaw.spi; + uses de.exxcellent.java9.jigsaw.spi.BillingServiceProvider; +} \ No newline at end of file diff --git a/playground/src/main/java/de/exxcellent/java9/process/ControlProcess.java b/playground/src/main/java/de/exxcellent/java9/process/ControlProcess.java new file mode 100644 index 0000000..441ad3c --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/process/ControlProcess.java @@ -0,0 +1,44 @@ +package de.exxcellent.java9.process; + +import java.io.IOException; +import static java.lang.System.out; + +public class ControlProcess { + + public static void main(String[] args) throws IOException, InterruptedException { + Process sleeper = Runtime.getRuntime().exec("sleep 1h"); + + // Get PIDs of own or started processes + out.println("Your pid is " + ProcessHandle.current().getPid()); + out.println("Started process is " + sleeper.getPid()); + + ProcessHandle handle = ProcessHandle.of(sleeper.getPid()).orElseThrow(IllegalStateException::new); + + // Do things on exiting process + handle.onExit().thenRun( // CompletableFuture + () -> out.println("Sleeper exited") + ); + + // Get info on process + out.printf("[%d] %s - %s\n", + handle.getPid(), + handle.info().user().orElse("unknown"), + handle.info().commandLine().orElse("none")); + + // Wait for process termination + ProcessHandle.of(sleeper.getPid()).ifPresent( + process -> process.onExit().thenRun( + () -> out.println("Sleeper exited") + ) + ); + + // Kill a process + ProcessHandle.of(sleeper.getPid()).ifPresent(ProcessHandle::destroy); + + // Give exit handler a chance to see the sleeper onExit() + Thread.sleep(99); + } +} + + + diff --git a/playground/src/main/java/de/exxcellent/java9/util/InputStreamExample.java b/playground/src/main/java/de/exxcellent/java9/util/InputStreamExample.java new file mode 100644 index 0000000..8c05cb7 --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/util/InputStreamExample.java @@ -0,0 +1,17 @@ +package de.exxcellent.java9.util; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Random; + +public class InputStreamExample { + + public static void main(String[] args) throws IOException { + byte[] buf = new byte[128]; + new Random().nextBytes(buf); + byte[] result = new ByteArrayInputStream(buf).readAllBytes(); // All bytes from an InputStream, yeah :D + + new ByteArrayInputStream(buf).transferTo(System.out); // Directly transferring from InputStream to OutputStream + } + +} \ No newline at end of file diff --git a/playground/src/main/java/de/exxcellent/java9/util/StackWalkerExample.java b/playground/src/main/java/de/exxcellent/java9/util/StackWalkerExample.java new file mode 100644 index 0000000..155130b --- /dev/null +++ b/playground/src/main/java/de/exxcellent/java9/util/StackWalkerExample.java @@ -0,0 +1,22 @@ +package de.exxcellent.java9.util; + +import java.util.List; +import java.util.stream.Collectors; +import static java.lang.System.out; + +public class StackWalkerExample { + + public static void main(String[] args) { + walkAndFilterStackframe().forEach(out::println); + } + + private static List walkAndFilterStackframe() { + return StackWalker.getInstance().walk(s -> + s.map( frame -> frame.getClassName()+"/"+frame.getMethodName() ) + .filter(name -> name.startsWith("de.exxcellent")) + .limit(10) + .collect(Collectors.toList()) + ); + } + +} \ No newline at end of file diff --git a/presentation/css/custom.css b/presentation/css/custom.css index d979443..40248d7 100644 --- a/presentation/css/custom.css +++ b/presentation/css/custom.css @@ -76,11 +76,11 @@ .col3-c { width: 32%; display: inline-block; } .col3-r { float: right; width: 32% } -.small p, .small li, p.small, div.small { - font-size: 86%; +.small p, .small li, p.small, div.small, span.small, .small code { + font-size: 86% !important; } -.x-small p, .x-small li, p.x-small, div.x-small { - font-size: 64%; +.x-small p, .x-small li, p.x-small, div.x-small, .x-small code { + font-size: 64% !important; } /* --- Darstellung Tweaks ----------------------------------------------- */ @@ -236,9 +236,45 @@ body { float:left; } +/* Aufzählung nicht zentrieren im 2col layout.*/ +.reveal .twocol ol, .reveal .twocol dl, .reveal .twocol ul { + display:table; +} /* Keine Einengung der width*/ .reveal blockquote { width: 80%; text-align: left; } + + +/* --------------------------------------------------------- */ +/* a specially decent code ref */ +.c-ref { + font-weight: lighter !important; + font-size: 50% !important; + vertical-align: super !important; + margin: 0 8px !important; + opacity: 0.6 !important; +} +.c-ref > code { + border: 1px solid rgba(255,255,255,.6) !important; + background: darkblue !important; +} + + +.jep { + font-weight: bold !important; + font-size: 45% !important; + vertical-align: super !important; + margin: 0 8px !important; + color: cornsilk !important; + border-radius: 5px !important; + padding: 0 7px 2px !important; + border: 1px solid rgba(255,255,255,.6) !important; + background: olivedrab !important; +} + +.left { + text-align: left; +} \ No newline at end of file diff --git a/presentation/index.html b/presentation/index.html index 26ceafb..7d5a584 100644 --- a/presentation/index.html +++ b/presentation/index.html @@ -1,384 +1,545 @@ - - - - Java 9: What's hot - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-

Java 9

-
Lightning Talk:
-

What's hot, what's not

- -
- ? for help -
-
- 2016-06-14 -
-
- - Creative Commons Lizenzvertrag -
IPv6 - a crash course - by - Benjamin Schmid - is licensed under a - - Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.. -
Based in parts on the work of Reveal.JS. -
-
-
- -
- -
-

Java 9

-

in a nutshell

-
- -
-
-- 82 JSR targeted -
-
- -
-
- ### Typischer IoT Zyklus - Generell meint IoT eigentlich immer folgenden Zyklus: - - 1. **Identifikation** eines Objekts - 2. **Erfassung** objektspezifischer **Eigenschaften** - (ID via RFID, Temperatur, Bewegung, Lage, Feuchtichgkeit, ... ) - 3. **Kommunikation** der Daten ins Netz (WLAN, Bluetooth, ZiggBee, ...) - 4. Und daraus **Aktionen** und **Mehrwert-Dienste** ableiten -
-
- -
-
- ### #1 Objekt-Identifikation - - RFID - - Strich-, QR oder Barcode -
-
- -
-
- ### #2 Erfassung: Sensoren - - - Arduino [151 Sensoren](https://www.adafruit.com/category/35) - - Tinkerforge : [52 Sensoren](https://www.tinkerforge.com/de/shop/bricklets.html?limit=all) - - Sparkfun (IoT Shop): [207 Sensoren](https://www.sparkfun.com/categories/23?sort_by=popular&per_page=400) -
-
- -
-
- ### #3 Kommunikation - - - Nachgerüstet (z.B. Arduino Shield) oder Teil der Plattform - - Varianten: - * WiFi - * Bluetooth - * Bluetooth LE - * ZigBee - * ... -
-
- -
-
- ### #4 Aktionen & Mehrwerte - - - **Monitoring** & Alerts (z.B: Temperatur, Energieverbrauch, ...) - - Neue **HMI-Schnittstellen** (Sprachsteuerung, Gestensteuerung, ...) - - **Item Location (indoor, outdoor)** / Fleet Tracking - using active (ZigBee, Beacon) and passive tags (RFID/NFC). - - **People proximity** via Smartphone Detection - - **Supply Chain Control** (z.B. Kühlüberwachung) - - **Smart Product Management** (z.B. autom. Lagerverwaltung) - - **M2M Applications:** Machine auto-diagnosis. - (z.B. Überwachung Kaffeemaschine) -
-
- -
- -
- - -
-
- # Workshop -
-
- -
-
-> Neue Erfahrungswelten: Jeder Teilnehmer bekommt echte, nackte Hardware -> in die Hand gedrückt. Am Beispiel einer aktuellen Plattform (Arduino, Tessel, -> etc.) machen wir unsere ersten Hardware-Erfahrungen samt Lötzinn und -> Lötkolben als geführter Kick-Start in die IoT-Welt. Die Ideen & Projekt- -> Möglichkeiten sind groß und daher noch offen. Mit Sicherheit dagegen habt -> ihr am Ende dieses Workshops die Wirkung der einzelnen Bits & Bytes -> deutlich zum Anfassen erlebt. Ein mögliches Beispiel wäre z.B. in Form -> eines individuell funkelnde LED-"Diamant" Anhängers auf Basis der -> Wearable-Plattform Arduino Flora.
-
- -
-
-##### Workshop: -### Prioritäten & Goals - -1. Hardware-Erfahrungen -2. Machbarkeit -3. "Internet"-Lösung -4. Cooles Projekt -
-
- -
- -
- -
-
-### Hardware Plattformen - -##### WLAN-Fähig (nativ) -- [ESP8266 (Arduino)](http://esp8266.net/) -- [Tessel 2](https://tessel.io/) -- [Particle Photon](https://www.particle.io/) -- uvm. [Übersicht bei Hackster](https://www.hackster.io/platforms) - -##### WLAN-Fähig (erweitert) -- Arduino / Adafruit WiFi Shsield -
-
- -
-### Software Plattformen - -- [Thingspeak](https://thingspeak.com/) -- [Ubidots](http://ubidots.com/) -- [Conrad Connect](https://conradconnect.de/) -- IFFT -- [Particle](https://www.particle.io/) -- [Amazon AWS IoT](https://aws.amazon.com/de/iot/) -- Vergleich: PaaS für IoT [(PDF)](https://opus.hs-offenburg.de/files/1331/Thesis_mkarow.pdf) -
- - -
- ## Weiterführende Ressourcen - - [hackster.io](https://www.hackster.io) is a community dedicated to learning hardware. - - Netter Maker-Bericht: [»Finding Europe with Lights«](http://www.heise.de/make/artikel/Finding-Europe-with-Lights-3079605.html) - - ##### Beispiele - - [Raumtemperatur mit Android App (Arduino)](https://www.hackster.io/KaustubhAgarwal/room-temperature-sensor-with-display-on-mobile-009beb?ref=explore&ref_id=respected__beginner_showcase&offset=1) - oder [Alternatives Projekt](https://www.hackster.io/KaustubhAgarwal/room-temperature-sensor-with-display-on-mobile-009beb?ref=explore&ref_id=popular__beginner_&offset=107) - - [$10 WiFi Rauchmelder](http://www.simpleiothings.com/10-diy-wifi-smoke-alarm-notifier-roost-nest-alternative-full-tutorial/) - - [LED Steuern via Handyausrichtung](https://www.hackster.io/electronerd/control-electronics-by-sliding-your-phone1-bcc974?ref=explore&ref_id=popular__beginner_&offset=130) - - [LED via Sprachsteuerung](https://www.hackster.io/msb4180/speech-recognition-and-synthesis-with-arduino-2f0363?ref=explore&ref_id=popular__beginner_&offset=149) - - [Smart Button via WiFi](https://www.hackster.io/noelportugal/ifttt-smart-button-e11841?ref=explore&ref_id=respected__intermediate_&offset=7) -
+ + + + Java 9: An short summary & overview over the new features + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+
+

Java 9

+
Lightning Talk:
+

An overview over
the new features

+ +
+ ? for help +
+
+ 2016-07-01 +
+
+ + Creative Commons Lizenzvertrag +
IPv6 - a crash course + by + Benjamin Schmid + is licensed under a + + Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.. +
Based in parts on the work of Reveal.JS. +
+
+
+ + + + + +
+ + + + + + + +
+
+ ## Datasheet +
+
+
+ ##### Datasheet + - **82** JEP targeted + - GA Release: + ~~2016-09-22~~ **2017-03-23** + - Brewing since: 2014-08-11 +
+
+ ##### Highlights + - Jigsaw + - Tooling + - HTTP API + - Language details +
+
+
+ + +
+ + + +
+ +
+
+ # Jigsaw +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ + +
+ + +
+
+ +
+ # Tooling +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ ## Language details +
+ +
+
+ +
+
+
+ +
+
+
+ + + +
+
+
+
+ ## Details +
+ +
+ +
+ +
+ +
+ +
+
+ -
+
+
+ +
+
-
-
- - +
- + - // Display the page number of the current slide - slideNumber: false, + - - - - - - + // Factor of the display size that should remain empty around the content + margin: 0.05, + + // Bounds for smallest/largest possible scale to apply to content + minScale: 0.2, + maxScale: 1.5, + + // Ctrl + Mouse-Click ==> Zoom in + zoomKey: 'ctrl', + + // Optional reveal.js plugins + dependencies: [ + { + src: 'lib/js/classList.js', condition: function () { + return !document.body.classList; + } + }, + { + src: 'plugin/markdown/marked.js', condition: function () { + return !!document.querySelector('[data-markdown]'); + } + }, + { + src: 'plugin/markdown/markdown.js', condition: function () { + return !!document.querySelector('[data-markdown]'); + } + }, + { + src: 'plugin/highlight/highlight.js', async: true, condition: function () { + return !!document.querySelector('pre code'); + }, callback: function () { + hljs.initHighlightingOnLoad(); + } + }, + {src: 'plugin/zoom-js/zoom.js', async: true}, + {src: 'plugin/notes/notes.js', async: true} + ] + }); + + + + + + + +