Fork me on GitHub
#clojure-italy
<
2019-07-30
>
reborg08:07:20

La versione volatile e’ stranamente piu’ lenta. Forse sto facendo qualcosa di brutto?

(defn powerset [coll]
  (let [cnt (count coll)
        bits (Math/pow 2 cnt)]
    (loop [i 0 r1 (transient [])]
      (if (< i bits)
        (recur
          (inc i)
          (loop [j 0 r2 (transient [])]
            (if (and (< j i) (< j cnt))
              (recur (inc j)
                     (if (bit-test i j)
                       (conj! r2 (nth coll j))
                       r2))
              (conj! r1 (persistent! r2)))))
        (persistent! r1)))))

skuro09:07:54

quanto piu' lenta?

reborg09:07:07

da 51 µs a 275 µs

reborg09:07:16

mi aspettavo che togliendo laziness di mezzo fosse gia’ un vantaggio (for VS loop) poi ho aggiunto transient VS vector ma rimane lentina

bronsa09:07:35

for traversa chunked

bronsa09:07:40

e usa unchecked int math

reborg09:07:49

ti sembra sufficiente per giustificare la lentezza? Puo’ essere ma mi sorprende

bronsa10:07:27

sospetto piu` la chunked traversal

andrea.crotti09:07:15

domandina su specs & co

andrea.crotti09:07:55

con Kafka e simili, anche se io aggiungo dei nuovi fields, eventi vecchi non li avranno

andrea.crotti09:07:34

quindi in un certo senso la spec dovra' o: - aggiungere automaticamente questi nuovi fields con dei valori di defaults - mettere tutti i nuovi fields come optional

andrea.crotti09:07:08

il problema grosso di questa cosa e' che e' moolto complicato scrivere dei test per vedere che non stai scazzando, e si rompe solitamente in prod/staging

andrea.crotti09:07:07

un altra opzione che sarebbe interessante e' aggiungere dei meta-data per dire quando un field e' stato aggiunto, e poi magari non trattarlo come required se l'evento e' piu' vecchio

andrea.crotti09:07:32

non so se qualcuno ha fatto una roba del genere, e/o se e' possible pero'

nilrecurring10:07:35

@andrea.crotti puoi fare un middleware che converte tutti gli eventi vecchi allo schema più recente? In questo modo puoi scrivere diverse spec (una per ogni schema) e poi fare dei property tests (con test.check o l’equivalente per spec) per verificare che il tuo middleware ti ritorna sempre un evento che conforma all’ultima spec

andrea.crotti11:07:22

in generale no, migrazioni di questo tipo sono rare

andrea.crotti11:07:43

perche' proprio in Kafka in general gli eventi sono immutabili

andrea.crotti11:07:09

che potrebbe in teoria anche funzionare, usando spec-tools che permette di usare solo maps per manipolare le specs

nilrecurring11:07:45

Si spec-tools lo trovo abbastanza necessario per lavorare con le spec. Comunque io con “migrazione” intendevo a lato applicativo (i.e. il “core” dell’applicazione non vede nient’altro che gli eventi all’ultimo schema), assumevo già che lo storage fosse immutabile

andrea.crotti11:07:19

Dopo qualche altra modifica la mia poc funziona

andrea.crotti11:07:16

Magari è difficile definire il timestamp dell added-at però

andrea.crotti11:07:52

Dato che sarebbe quello in cui fai il deployment in teoria

reborg11:07:18

ma uno non potrebbe aggiungere una :version su ogni evento che specifica secondo qualche schema dev’essere validato?

andrea.crotti11:07:40

Mah il timestamp ha l'abbiamo

andrea.crotti11:07:53

La version sarebbe più complicato da mette

reborg11:07:58

ok, quindi puoi lavorare incrementalmente con spec-v1, spec-v2 etc? (timestamp o version)

andrea.crotti11:07:09

In teoria si ci penso un attimo

andrea.crotti14:07:48

qualcuno sa di un modo facile per tracciare tutti i forms da un particolare namespace?

andrea.crotti14:07:07

per esempio per debuggare un test particolarmente stronzo, si fa per perfino fatica a capire dove si pianta

andrea.crotti14:07:45

sarebbe comodo vedere qual e' l'ultima sexp valudata prima che si pianta tutto

andrea.crotti14:07:16

ho provato con clojure.tools.trace, ma servirebbe qualcosa di piu' nucleare per farlo su tutto il progetto in un colpo solo

andrea.crotti15:07:21

devo provare qualche magia con https://github.com/philoskim/debux magari

reborg15:07:49

Puoi provare con clojure.core/*loading-verbosely* true, almeno vedi che namespace tenta di caricare

reborg16:07:44

se hai lein, metti :global-vars {*loading-verbosely* true} in project.clj

andrea.crotti17:07:13

purtroppo debuggare problemi con kakfa topologies e' un delirio

andrea.crotti17:07:40

con la libreria di test in http://github.com/FundingCircle/jackdaw adesso e' 1000 volte meglio ma sto per l'appunto migrando questo progetto a jackdaw

andrea.crotti17:07:54

quindi sono ancora all'eta della pietra in confronto come tooling