b0sh.net

Proudly debugging the system since 1981

Categoria: programmazione Pagina 1 di 5

Commenti al codice e affini

Nella parte non visibile dei programmi si trovano cose strane. Una recente scoperta, nascosta in una riga alta 1px. Mah.

Una delle mie attività principali consiste nel favorire e ampliare le reazioni.
Io non progetto soluzioni, ma facilito le reazioni; è l’organizzazione a preoccuparsi dei contenuti.
Io analizzo la situazione, la riporto ai responsabili e mi assicuro che ogni decisione venga immediatamente comunicata e passi attraverso una catena informativa con molteplici retroazioni.
Costruisco delle reti, accresco la connettività dell’organizzazione e amplifico le voci degli operatori (che altrimenti rimarrebbero inascoltate).
In seguito al mio lavoro, i responsabili cominciano a discutere cose che, normalamente, non sarebbero state discusse, e in questo modo viene ad accrescersi la capacità di apprendere propria dell’organizzazione.

Fritjof Capra, La scienza della vita, Rizzoli, 2002.

Tastiera meccanica

E’ un attrezzo che volevo provare da molto tempo, ma visto che la maggior parte della mia attività di scrittura si svolge su un notebook che mi porto in giro, non mi ero mai deciso.

Ora questa lunga permanenza a casa, e un po la noia, mi ha convinto a comprare questo strumento di tortura uditiva per chi mi sta intorno. Si perchè fa un rumore paragonabile ad una vecchia macchina da scrivere.

Però, per il resto, mi chiedo come ho fatto prima di oggi. La scrittura è infinitamente più comoda e piacevole. Come farò a tornare ad usare la tastiera del notebook?

La tastiera scelta è una Ajazz AK33, con layout ridotto (come si vede nella foto), ha un discreto peso, data la struttura metallica e giochi di luci molto vari, non che la cosa mi interessi molto. E inoltre ha il layout americano, cosa estremamente comodo quando si programma. Ecco un po’ meno quando si scrive in italiano ma comunque si può cambiare e anche se quello che è stampato sul tasto non corrisponde a quello che viene scritto non è un problema. Diciamo che il layout italiano lo so a memoria. Un po’ meno quello americano per cui ogni tanto guardo i tasti per sapere cosa scrivere.

Vue.js – Primo impatto

Alla fine il tempo è quello che è, anche in quarantena, e non ho visto molto, ma qualche prima impressione posso scriverla.

Aspetti interessanti:

  • Non necessita che tutta l’applicazione sia una SPA. Può esserlo, ma può anche essere una versione ibrida, con html statico o generato server side in alcune parti, e una applicazione Vue.js dove serve più reattività.
  • Non necessita di scaricare mille cose, librerie, dipendenze, compilare, etc … si aggiunge il link al js sulla CDN e si ha tanto pronto.
  • Approccio a componenti, reattività e data binding. Ovvio. Se no tanto valeva usare una tecnologia server side con un pò di jQuery.

Dubbi:

  • Come scala all’aumentare della complessità dell’applicazione? In genere i framework che puntano a facilitare l’ingresso finiscono anche a facilitare lo spaghetti coding all’aumentare della difficoltà del problema che devono risolvere. Ma dovrei vedere qualche lezione in più.

Vue.js – Corsi gratis per due giorni

Oggi e domani sono accessibili gratuitamente tutti i corsi di VueMastery su Vue.js.

Non ho un idea sull’argomento, ma probabilmente lunedì, sfruttando l’isolamento forzato, ne saprò qualcosa di più.

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) ?

Leggi tutto

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.

SocialImporter / source / — Bitbucket

Prima versione del progetto di importazione dei post da vari social a wordpress. Per ora supportato solo delicious.
https://bitbucket.org/sgalliani/socialimporter/src

Code Quality

Mi devo segnare la vignetta di oggi di xkcd. Può tornare utile in caso di spaghetti-code: http://xkcd.com/1513/

Pagina 1 di 5

Powered by WordPress & Theme by Anders Norén