Proudly debugging the system since 1981

Categoria: programmazione (Pagina 3 di 7)

Proxy Dinamico per logging

Può essere necessario loggare tutto ciò che fa una determinata classe che però fa parte di una libreria e non contiene tutti i log desiderati. Supponendo che non sia necessario debuggare la classe in sè, che fa quello che deve fare nel modo giusto, ma come viene utilizzata all’interno del progetto ho trovato che realizzare un proxy dinamico sia una soluzione efficace e molto versatile. Anche perchè fatto uno, va bene per qualsiasi classe.

La classe che andiamo da realizzare fa due cose :

  • implementa InvocationHandler in modo che venga richiamata tutte le volte che viene chiamato un metodo dall’utilizzatore del target da loggare
  • ha un factory method di comodo che crea una nuova istanza di proxy dinamico attaccando se stessa come InvocationHandler

Implementare InvocationHandler significa implementare il metodo invoke:

invoke di fatto richiama il metodo del target e logga nome del metodo, parametri e risultati. Più la gestione delle eccezioni del metodo target e di tutte le altre possibili eccezioni.

Il metodo wrap permette di avere la nostra classe ben wrappata con un solo comando.

Visto che tutto questo mi ha permesso oggi di scoprire un utilizzo un pò insensato dell’accesso ai dati con conseguente lentezza ho pensato di condividerlo.

Perchè?

Contesto: classe Java, framework Wicket (ma non è significativo), IDE Intellij.

Quale sarà mai il motivo percui, un anonimo programmatore che mi ha preceduto, può aver pensato che avesse senso fare un metodo privato, che nel nome richiama l’idea di un factory method, che ritorna un campo della sua stessa classe?

E poi perchè commentarlo con // (5) ?

Continua a leggere

Please Don’t Learn to Code Unless… – DZone Agile

“Focusing On Coding Inflates the Importance of Finding the “Right” Method to Solve a Problem Rather Than the Importance of Understanding the Problem. Before we start working on a solution to a coding problem we have to decide what the problem is–if we even have one to begin with. If we let ourselves become fixated on how to solve a problem via code–regardless of if it is a programming problem or not–and lose sight of why, we gain nothing.”

Che è più o meno:

Concentrarsi  sulla programmazione porta a concentrarsi sulla ricerca del modo “giusto” di risolvere un problema invece che concentrarsi l’importanza di capire il problema stesso.

Prima di iniziare a programmare dobbiamo capire il problema e se veramente esiste. Se ci fissiamo su come risolvere un problema con la programmazione, senza considerare se questo è un problema di programmazione o meno, e dimentichiamo il perché lo stiamo risolvendo, non guadagniamo nulla.

https://dzone.com/articles/please-dont-learn-to-code-unless

Fold

Mi ci è voluta più di qualche imprecazione per arrivare a questa implementazione :

fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
    return customers.fold(allOrderedProducts, {
        orderedByAll, customer -> 
orderedByAll.minus( orderedByAll.filter { !customer.orderedProducts.contains(it) }) })
}

Salvo poi scoprire nelle soluzioni che esisteva il magico intersect

fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
    // Return the set of products ordered by every customer
    return customers.fold(allOrderedProducts, {
        orderedByAll, customer ->
        orderedByAll.intersect(customer.orderedProducts)
    })
}

L’esercizio era questo : https://github.com/Kotlin/kotlin-koans/blob/master/src/ii_collections/_22_Fold_.kt

Comunque Kotlin è bellissimo.

Deviazione standard con PL/SQL

Pl/Sql implementa la definizione probabilistica di deviazione standard, ovvero :

dv_std_probcon la comoda funzione STDDEV, mentre a me (e forse non solo a me) serviva la versione statistica, ovvero :

dv_std_statChe si traduce in  :

SQRT((1 / COUNT(*)) *  (SUM( $colonna  * $colonna ) – (COUNT(*) * AVG( $colonna ) * AVG( $colonna ))))

Immagini da wikipedia

Codemotion Milan 2014 – Secondo giorno

Appunti sugli speech del secondo giorno :

  • Why everyone is excited about Docker (and you should too…) tenuto da Carlo Bonamico : Si, Docker è veramente interessante. Permette di risolvere alcuni problemi che sono molto comuni: replicare ambienti di produzione anche complessi in locale, testare efficacemente, eseguire dei deploy sicuri. L’idea di base è avere qualcosa che assomigilia ad una virtual machine, ma è molto piu leggera ed è quindi possibile averne anche diverse decine in esecuzione su un computer desktop, ed è “stratificata” e componibile a moduli. Slides.
  • L’architettura di Stack Overflow tenuto da Marco Cecconi : come hanno risolto problemi inerenti l’elevato traffico in Stack Overflow. Da questo ho capito che .net ha grossi, grossi problemi col garbage collector. E tutto il lavoro sta nel cercare di instanziare il minor numero di oggetti possibili. Slides.
  • Evolutive experience design; o la sopravvivenza del più adatto tenuto da Luca Mascaro : l’incapacità dei programmatori di capire i babbani è una triste realtà. Più che altro per i babbani, che ogni giorno sono immersi in un mondo che non capiscono. Ma tant’è e quindi per essere un programmatore migliore ogni tanto è bene sentire uno o due speech tenuti da designer (ovvero utenti che sanno spiegare perchè non capiscono quello che per noi è ovvio). Cavolate a parte l’introduzione del concetto evoluzionistico al design è molto interessante. Non necessarimente la soluzione più raffinata è la migliore … o meglio è la migliore oggi, ma probabilmente avrà problemi ad affrontare i cambiamenti che inevitabilmente ci saranno. Due mini slide su tutte :

  • Designing for cross channel user experience tenuto da Chrissy Welsh : Sulla necessità di tenere conto che gli utenti del mobile, gli utenti desktop e gli utenti che si presentano di presona spesso (sempre?) sono le stesse persone e che bisogna offrigli la possibilità di fare ciò di cui hanno bisogno a prescindere dal canale che usano. E ovviamente non basta fare un sito responsive, come è stato fatto ripetere a tutti in coro stile alcolisti anonimi.
  • Time Series: Dalla Teoria alla Pratica con MongoDB tenuto da Massimo Brignoli, Ivan Fioravanti : l’utilizzo di mongoDB nelle sequenze temporali di dati, con alcuni trucchi per migliorare le performance in lettura e analisi. Sildes.

Repository ufficiale delle slides su slideshare .

Codemotion Milan 2014 – Primo giorno

Una volta tanto scrivo un post non automatizzato: il 28 e 29 novembre ho partecipato al codemotion 2014 a Milano e di seguito due righe sugli speech che ho seguito il primo giorno.

  • Become a Frontend Developer Ninja using HTML5, JavaScript and CSS3 tenuto da Marco Casario : Molto focalizzato sull’ottimizzazione prestazionale dell’html. Sono stati presentati alcuni strumenti di valutazione delle performance, sia interni al browser (Chrome in primis) che su siti esterni. Alcuni link che ho colto al volo sono presenti sul post di questa settimana. Sildes.
  • Recipes to develop a reactive and cloud-ready application using Scala and Akka tenuto da Roberto Bentivoglio : L’utilizzo di Akka come base per sistemi distribuiti per svolgere combiti complessi ma divisibili. Il framework astrae la complessita e lavorare con un core o 1000 non fa differenza ( qualcuno ha detto hadoop ?). Da ignorante di Akka e quasi ignorante di Scala ho faticato a seguire l’esposizione, ma l’impressione era di essere in buona compagnia. Slides.
  • Programming Motherfucker or how I rediscovered my hacker spirit tenuto da Ole Michaelis: La nascita e l’evoluzione di un pet-project. Le difficoltà (soprattutto per ottenere un design decente, grosso limite di molti programmato). Il pet-project è slidr.io e dovrebbe servire per condividere slide, ma al momento non è raggiungibile. Troppo successo? Comunque interessante e bello vedere come alti e bassi di progetti specie non pagati siano problemi che anche altri affrontano. Comunque rilasciate sempre! Edit: io non lo raggiungevo probabilmente per problemi di DNS. Le slides sono effettivamente li.
  • Fun with functional JavaScript tenuto da Kuba Wali?ski: L’amato (poco) e odiato (tanto) javascript sorprende come linguaggio pronto per la programmazione funzionale. Slides
  • Pragmatic Functional Refactoring with Java 8 tenuto da Raoul-Gabriel Urma : Introduzione alla programmazione funzionale con Java 8, con attenzione al’utilizzo dei Predicate e alle Lambda sulle collections per ottenere una maggiore leggibilità del codice e migliore riutilizzabilità. Interessante e comprensibile. Coautore di Java 8 in Action. Slides
  • Laziness, trampolines, monoids and other functional amenities: this is not your father’s Java tenuto da Mario Fusco: Quasi una seconda parte sulla programmazione funzionale con java 8, approfondimenti sul concetto di monoide (una volta che capisci i monoidi li vedi ovunque… sarà… ci credo per fiducia), laziness e trampolini. Interessante ma gli speech in inglese tenuti da italiani a italiani sono una forzatura che azzoppa la fruibilità e l’attenzione.  Coautore di Java 8 in Action. Slides.
  • La professione dello sviluppatore (3 anni dopo) Gabriele Lana : Scelta come “defaticamento” dopo la tripletta funzionale si è rivelato il talk più divertente della giornata, e quello che forse ha fatto riflettere di più. Tanti spunti, su come la professione del programmatore possa e debba migliorare, e se oggi è cosi è colpa in buona parte dei programmatori stessi. In poche parole ci vuole più consapevolezza del proprio valore e più etica in quello che si fà. E gli agenti per strappare contratti migliori. Si voglio decisamente un agente. Video del prequel (3 anni prima) . Per ora c’è solo qualche scatto e le slides, spero che l’organizzazione pubblichi il video integrale.

 

« Articoli meno recenti Articoli più recenti »

© 2025 b0sh.net

Tema di Anders NorenSu ↑