If you can't read please download the document
Upload
andrea-del-bene
View
1.757
Download
2
Embed Size (px)
Citation preview
2. Per i pi distratti...
Dolphin doveva contenere un bel po' di novit, soprattutto sul fronte del linguaggio (progettiLambdaeCoin ) e della modularizzazione (progettoJigsaw ). 3. Per i pi distratti... Alcuni fatti contingenti (passaggio a GPL, passaggio di Sun ad Oracle...)hanno subito fatto capire che lo sviluppo di Dolphin non sarebbe stato rapido... Inoltre le feature principali sono oggettivamente molto complesse e di forte impatto sul linguaggio. Impensabile realizzarle in pochi anni... E cos Oracle chiese alla community se volevano l'uovo oggi o la gallina domani:
5. Il piano B Il piano B stato quello vincente. Oggi abbiamo Java 7 ma senza alcune delle caratteristiche pi complesse. I progettiLambda ,Jigsaw , e parte diCoinsono stati rinviati al Java 8 previsto il prossimo anno (ma baster davvero un anno ???) Nonstante questi tagli importanto Java 7 presenta molte interessanti novit enon certo una release in tono minore ! Le novit sono circa 25 divise nei seguenti gruppi:
15. Le novit di Java 7 Nome Gruppo Descrizione More new I/O APIs for the Java platform (NIO.2) I/O and networking Nuove classi per rendere l' I/O asincrono , scalabile e flessibile. Small language enhancements (Project Coin) Language Possibilit di usare le stringhe nelloswitch , migliorato ilcatching di pi eccezioni , migliorata latype inference , ecc... Concurrency and collections updates Core Introduzione di un fork/join framework e miglioramento dell'attuale libreria per la concorrenza. Elliptic-curve cryptography (ECC) Security & Cryptography Evoluzione dell'attuale sistema di crittografia a chiave pubblica RSA. Offre maggior sicurezza con chiavi pi piccole. Siccome la carne al fuoco tanta inizieremo da quelle che dovrebbero essere le novit pi forti 16. Un nuovo CSS per i JavaDoc :-) 17. New I/O in Java 7 Andrea Del Bene Jug Marche [email_address] 18. La vecchia libreria di I/O La gestione dell'I/O di Java sempre stata la feature pi criticata assieme alle gestione della date (per queste tocca aspettare la 8). Quasi tutti gli utenti (specialmente i newbies) si sono chiesti almeno una volta perch scrivere tanto codice per leggere/scrivere un file: In realt l'I/Ostream-baseddi Java non affatto male, ma come molte sui aspetti manca di qualche utility che renda il suo uso pi amichevole. //legge tutte le righe di un file FileInputStream fstream= newFileInputStream ( "textfile . txt" ) ; List lines = new ArrayList(); DataInputStream in= newDataInputStream ( fstream ) ; BufferedReader br= newBufferedReader ( newInputStreamReader ( in )) ; String strLine ; while (( strLine=br . readLine ()) != null ) { lines.add ( strLine ) ; } in . close () ; 19. Jakarta Commons I/O Per far fronte a questa complessit d'uso sono nate varie librerie tra cui la pi famosa probabilmente Jakarta Commons I/O: org.apache.commons.ioClass FileUtils java.lang.Object org.apache.commons.io.FileUtils General file manipulation utilities.Facilities are provided in the following areas:
29. I fantastici 4 del nuovo I/O Per migliorare l' I/O Java 7 ha introdotto due classi utilities ricalcando quanto fatto con Collections e Arrays per le rispettive entit. Sono le classiFileseFileSystems , entrambe nel packagejava.nio.file . Le classi prendono spunto da quanto fatto in Jakarta Commons I/O, proponendo addirittura metodi quasi identici comestatic List readAllLines() . Ovviamente non si sono limitati a copiare la concorrenza. Le classiFileseFileSystemsnon operano direttamente sulla classe File o sugli stream ma su due nuove entit nuove di zecca, ossial'interfacciaPathe la classe astrattaFileSystempresenti sempre nel packagejava.nio.file . FileSystemsfa da factory perFileSystem , che a sua volta instanziaPath . FileSystems FileSystem Path 30. L'interfaccia Path e la classe Paths E' un po' l'elemento centrale del nuovo I/O. Non rappresenta direttamente un file o una directory, ma piuttosto il suo pathsystem dependent.Restituisce l'istanza File associata tramitetoFile() . Permette di navigare l'albero del file system in un modo che ricorda molto la navigazione di un documento XML: path ha un parent e dei siblings e un path root (vedremo in un esempio successivamente). Paths la classe utility per istanziare dei Path usando il FileSystem locale bypassando la chiamata a FileSystems
Path path=FileSystems.getDefault().getPath("logs", "access.log"); Path path=Paths.get("logs", "access.log");
31. Esempi apertura file e navigazione FS Sia getPath di FileSystem sia get di Paths accettano uno o pi parametri stringa che compongono il path:
Path path=Paths.get("home", "andrea", text.txt);
Path path=Paths.get("home"); path = path.resolve(andrea); path = path.resolve(text.txt); 32. Classe Files E' la classefactotume corrisponde grossomodo a FileUtils di Jackarta Commons. Tra i metodi pi interessanti (tutti static) si segnalano:Nome Ritorna Descrizione copy Path Copia un file. Presente in diverse versioni per supportare in input il tipo Path ma anche InputStream e OutPustream.
Supporto alla creazione/distruzione di directory e file. Delete esiste solo nella version con Path in input. Esistono versioni di creazione per lavorare nella directory temporanea di sistema readAllLines List Legge tutte le righe di un file testuale. Funzione pensata per file non troppo grandi. readAttributes BasicFileAttributes o Map Lettura degli attributi di un file 37. Lettura di tutte le righe di un file
//legge tutte le righe di un file PathfileToRead=Paths.get ( "textfile . txt" ) ; List lines=Files.readAllLines( fileToRead, UTF-8 );
38. Ciclare su una directory
public classWalkThroughtDir { public static voidmain(String[] args)throwsException{ Path start = Paths.get(System.getProperty( "user.home" )); Files.walkFileTree(start,newSimpleFileVisitor() { @ Override publicFileVisitResult visitFile(Path file, BasicFileAttributes attrs) throwsIOException{ System.out.println(file); returnFileVisitResult.CONTINUE; } @ Override publicFileVisitResult postVisitDirectory(Path dir, IOException e) throwsIOException{ System.out.println(dir); returnFileVisitResult.CONTINUE; } });} } 40. Esplorare le propriet dei file
45. File change notification
public static voidmain(String[] args)throwsException { WatchService watcher=FileSystems.getDefault().newWatchService(); Path dir = Paths.get(System.getProperty( "user.home" )); WatchKey key = dir.register(watcher,StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY); for(;;) { // wait for key to be signalled key = watcher.take(); // process events for(WatchEvent event: key.pollEvents()) { System.out.println(event.context()); } // reset key key.reset(); } } 47. Asynchronous I/O
49. Asynchronous I/O
53. Concurrency and collections updates Andrea Del Bene Jug Marche [email_address] 54. Il modello Fork/Join Nel campo del calcolo distribuito il modello Fork/Join mira a risolvere problemi complessi dividendolo in micro-problemi pi semplici da eseguire in parallelo. Il problema ed i suoi sottoproblemi sono risolti da una singola unit esecutiva ( Task ) che rispetta il seguente algoritmo (funzione): Result solve(Problem problem) { if (problem is small) directly solve problem else { -split problem into independent parts -fork new subtasks to solve each part -join all subtasks -compose result from subresults } } 55. Implementare Fork/Join in Java Implementare il modello Fork/Join non cos semplice come sembra... Se ad un task si fa corrispondere un Thread Java si otterrebbe un'implementazione molto pesante e l'overhead supererebbe i benefici. Dug Lea un professore dell'universit di New York, luminare della programmazione parallela. Ha scritto una libreria per introdurre il modello Fork/Join in Java. Quella libreria diventata la JSR 166y, rilasciata in Java 7 La libreria si occupa interamente della creazione dei task e della loro sincornizzazione. 56. Somma di un array di interi 1/2 public classSolverextends RecursiveAction{ private int [] list; public longresult; publicSolver( int [] array) { this .list = array; } @ Override protected voidcompute() { if(list.length == 1) { result = list[0]; }else{ intmidpoint = list.length / 2; int [] l1 = Arrays.copyOfRange(list, 0, midpoint); int [] l2 = Arrays.copyOfRange(list, midpoint, list.length); Solver s1 =newSolver(l1); Solver s2 =newSolver(l2); invokeAll(s1, s2); result = s1.result + s2.result; } } public longgetResult(){ return result; } } Vediamo un esempio di applicazione del modello Fork/Join. Come caso d'uso consideriamo la somma degli elementi interi di un array. 57. Somma di un array di interi2/2 public static voidmain(String[ ]args ){ // Check the number of available processors intnThreads = Runtime.getRuntime().availableProcessors(); System.out . println( nThreads ); int [] list =new int [2000000]; Random generator =newRandom(19580427); for ( inti = 0;i < list.length ; i ++ ) { list[i] = generator.nextInt(500000); } Solver mfj =newSolver(list); ForkJoinPool pool =new ForkJoinPool(nThreads); pool . invoke( mfj ); longresult = mfj.getResult(); System.out .println ( "Done. Result: "+ result); } 58. Progetto Coin Andrea Del Bene Jug Marche [email_address] 59. Strings in switch public classTestStringsInSwitch { public voidtest() { finalString str ="foo" ; switch(str) { case "foo" : System.out.println( "mooh" ); break ; case "bar" : System.out.println( "miau" ); break ; default : break ; } } public static voidmain( finalString[] args) { newTestStringsInSwitch().test(); } } 60. Diamond operator importjava.util.ArrayList; importjava.util.List; public classTestDiamondOperator { public voidtest() { finalList list =newArrayList (); list.add( "Foo" ); System.out.println(list); } public static voidmain( finalString[] args) { newTestDiamondOperator().test(); } } E' stata migliorata latype inferenceaggiungendo l'operatore diamondutile quando si istanziano le collection 61. Multy catch and rethrow public classTestMultiCatchAndRethrow { classExAextendsException { } classExBextendsException { } public voidtestMultiCatch() { final inta = 0;try{ if(a == 0){ throw newExA(); } if(a == 1){ throw newExB(); } }catch( ExA|ExB ex ) { System.out.println(ex.getClass() +" was thrown and caught" ); } } public voidtestReThrow()throwsExB { final inta = 0; try{ if(a == 0) { throw newExA(); } if(a == 1) { throw newExB(); } }catch( finalExA exa) { System.out.println( "Exa was caught" ); }catch( finalException ex) { System.out.println(ex.getClass() +" was thrown, caught and rethrown" ); throw ex; } } } 62. Automatic resource management public classTestAutomaticResourceManagement { public voidtest() { try( finalBufferedReader br =newBufferedReader( newFileReader( "./TestAutomaticResourceManagement.java" ))) { String line; while((line = br.readLine()) !=null ) { System.out.println(line); } }catch( finalIOException e) { } } public static voidmain( finalString[] args) { newTestAutomaticResourceManagement().test(); } } 63. Integer litterals public classTestIntegerLiterals { public voidtest() { final intlarge = 1_000_000; System.out.println(large); final intbinary = 0b1011; System.out.println(binary); } public static voidmain( finalString[] args) { newTestIntegerLiterals().test(); } } Si tratta di un po' di zucchero sintattico per esprimere pi comodamente nel codice dei valori numerico/binari. 64. Crittografia a curva ellittica Andrea Del Bene Jug Marche [email_address] 65. I cifrari a chiave pubblica.
67. Le operazioni difficili dei cifrari
72. Cuva ellittica vs RSA
73. Support for Dynamically Typed Languages in the JVM Andrea Del Bene Jug Marche [email_address] 74. Linguaggi dinamici su JVM
75. Grazie ! Andrea Del Bene JUG Marche - www.jugancona.it