Qua

Reader

A list of all postings of all blogs on Qua where the author has configured the blog to publish on this page.

from 工人日记

今天,新的“修正主义”人Cby又来本组开他的“诉苦会”了。

老的“修正主义”人Csj——往日或许提过,是公然宣称“不加班者是工作量不饱和”的。依我看,此人倒不如省些面具,直说“请大家夜宿在司,磨洋工”吧。然而,因着“安全检查”之事,本司已明文规定“禁止夜宿在司”了,这却是无心插柳。

新的这位不遑多让。

之所以在这“诉苦会”用上双引号,其意在表示明贬。此人说“数年未曾使用休假”,明着是说工作如何辛苦、自己如何敬业,实际语境却是欲压制别人正常休假要求。自行放弃法定权利,本是出自他个人自由;以此为由“劝说”别人放弃,则是滑天下之大稽。

 
阅读更多

from MrBlog....

I get a lot of DMARC reports because I host mail for a couple of domains. Most of these mails require no attention as they are just notifications that others use one of our domains. I want to separate these mails from my normal mail workflow and auto archive them if I haven't looked at them within, say, 2 weeks.

Doing this with sieve server-side has my preference, but apparently it's not trivial to determine the age of a message, which is the core logic needed here. Also, the processing of sieve rules is normally only during reception of messages, not ad-hoc or on some other event, although dovecot and pigeonhole have some options for this, among others the sieve-filter tool.

I really only found one implemenation online which roughly solves the same problem I was having, but this involved more than needed I think.

My solution consists of 3 parts:

  1. the sieve script that handles DMARC reports on reception and age-ing;
  2. use of an extension that calls an external program to evaluate expressions to determine age;
  3. a daily job that runs the sieve script in the scope of the designated folder.

Here's the sieve script which deals with DMARC reports both in the normal INBOX flow and a special treatment after 14 days. The latter part is not automatic by dovecot on reception of emails, but triggered by a run of the sieve-filter program.

require ["date","fileinto","relational","variables","environment","imap4flags",
         "vnd.dovecot.execute", "vnd.dovecot.environment"];

# Parameters
set "dmarc_folder" "Folder.for.dmarc-reports";
set "purge_days" "14";

# Move DMARC notifications when received
if environment :is "vnd.dovecot.default-mailbox" "INBOX" {
  if anyof (
    header :contains "From" "dmarcreport@microsoft.com",
    header :contains "From" "noreply-dmarc-support@google.com",
    header :contains "From" "opendmarc@mail.arctype.co",
    header :contains "From" "opendmarc@box.euandre.org"  )
  {
    addflag "\\Seen";
    fileinto "${dmarc_folder}";
    stop;
  }
}

# When running in the dmarc_folder, archive when age is <purge_days>
if environment :is "vnd.dovecot.default-mailbox" "${dmarc_folder}"
{
  if currentdate :matches "julian" "*"
  {
    # Run a simple bc expresssion to get <purge_days> ago from todays julian day
    execute :output "fourteen_days_ago" "bc" "${1} - ${purge_days}";

    # Compare this with Date header and archive when age reached
    if date :value "le" "Date" "julian" "${fourteen_days_ago}"
    {
      fileinto "Trash";
      stop;
    }
  }
}

The first part of the sieve script just moves the mails into the dmarc-reports folder and is a normal sieve processing rule. The second part runs if the default folder is the dmarc-reports folder. If so, it uses the ext_program extension of the sieve interpreter to let the bc program evaluate the expression for the age of the message.

This uses a tiny script in the configured sieve execute bin directory of the ext_programs extension

#!/bin/sh
echo ${1} | /usr/bin/bc

which just pipes the input given by the sieve line into the bc program. On returning, stdout is put into the fourteen_days_ago variable. I'm using execute because I do not need to pipe the whole message into the external program, but specify input specifically.

With the above configuration I can set a cron job in the crontab of the vmail user to run

sieve-filter -We -u <mymailaccount> \
             /path/to/vmail/mymailaccount/sieve/dmarc-archiver.sieve \
             Folder.for.dmarc-reports

which executes the sieve script mentioned above in the IMAP folder <dmarc_folder> only.

I'm not sure why sieve makes it so difficult to get the age of an email (unless I'm missing something). Protonmail solves this by having a custom extension 'vnd.proton.eval' which does something similar like the above, but in the scope of the sieve language itself without having to shell out to an external program explicitly. (I think; I have not seen their implementation)

My approach above obviously has some drawbacks:

  • the bc external program is called for every mail that matches, fine for 10 or 20 I guess, but rather inefficient if the amount of matched messages is big. For now, not a problem.
  • unsure what sort of security consequences this has, the execution scope and environment is very limited, but we're still giving control to a script calling other programs.
 
Read more...

from 工人日记

尊敬的客户: 您好! 针对近期出现的停工缓建和未按时交付楼盘情况,我行高度重视,专人专班跟进负责。对于当前情况,我行将继续与当地政府部门、监管部门保持密切沟通,关注开发企业及涉及项目的最新动态,积极参加政府组织的协调会议,贯彻落实当地政府与机关部门的最新政策要求,全力配合、统一行动,推动停工项目复工复产。 此外,我行就项目各方协调情况、复工复产方案进展、最新政策落实要求等,将第一时间与您同步。如您因受疫情影响暂时失去收入来源,您可随时与贷款行客户经理联系,我行可为您提供延期还款和征信保护等支持,缓解您的还款压力。 后续,我行将继续坚决贯彻落实党中央、国务院决策部署,坚持“房住不炒”定位,积极做好客户服务。感谢您一直以来的关注与支持!

可能是“恒大地产烂尾楼”之类的“购房者强制停止还贷”余波。

 
阅读更多

from 工人日记

如果有人对这司的党支部感兴趣

2022年7月理论学习

坚持“三个第一时间”学习机制

主要内容:

  1. 习近平总书记主持十九届中共中央政治局第四十次集体学习并发表重要讲话。
  2. 习近平总书记在湖北武汉考察时强调,把科技的命脉牢牢掌握在自己手中,不断提升我国发展独立性自主性安全性。
  3. 习近平总书记关于力戒形式主义、官僚主义的重要论述。
  4. 经典著作《矛盾论》《反对本本主义》
 
阅读更多

from 工人日记

有句话说小孩儿几岁的猫嫌狗憎,依我看倒是男的上年纪了惹人厌的操作多。好比咱这工作组吧,年纪最大这男的醒着的时候老爱敲桌清嗓。休息时间,人都睡下了,他却突然拍案而起。人请他安分点,他还要反嘴说这办公室不是休息室。这休息时间也不是办公时间嘛,怎么就你一个这么不“合群”。 ;P

 
阅读更多

from Amassando ideas

Dentro de la comunidad de programación competitiva existen varias guías acerca de como mejorar y prepararse resolviendo problemas. Esta pequeña guía pretende hacer algo distinto, una lista de comprobación de cosas que hacer antes y durante una competencia de programación.

Antes del contest

  • No tener hambre ni sed
  • No tener ganas de ir al baño
  • Tener agua u otro bebestible a mano
  • Tener snacks a mano por si me de hambre
  • Entrar a Codeforces (o el sitio donde se aloje la competencia) e iniciar sesión.
  • Abrir un archivo de texto para cada problema con la plantilla a usar para la competencia
  • Abrir esta lista de comprobación

Al resolver un problema

  • Leer el enunciado cuidadosamente
  • Determinar exactamente qué es lo que tiene que hacer el programa (matemáticamente si es posible)
  • Comprobar límites de la entrada, de tiempo y de memoria

Encontrar la solución

  • Buscar patrones (programación dinámica, búsqueda binaria, grafos, etc)
  • Reducir a casos sencillos

Implementar la solución

  • Escribir grandes pasos
  • Escribir el código
  • Probar con los casos de ejemplo
  • Probar con pequeños casos borde

Si da Wrong Answer

  • Probar con distintos casos de prueba en los que conozcamos la salida esperada. Si son grandes, generar los casos con números aleatorios y comparar nuestro programa con una solución de búsqueda exhaustiva
  • Inspeccionar el código en busca de errores
  • Intentar demostrar la solución
  • Cambiar los ints por long longs por si hay un overflow escondido.
  • Si todo lo anterior falla, implementar la solución de una forma diferente
  • Si aún así nada funciona, cambiar de problema.

Si da TLE/MLE

  • Reducir constantes
  • Hacer pequeñas optimizaciones (arrays en vez de vectores, uso de variables globales, etc)
  • Si aún así nada funciona, cambiar de problema.

Si da RE

  • Fijarse en los subíndices de los arrays y vectores
  • Evitar divisiones por 0
  • Si todo lo anterior falla, implementar la solución de una forma diferente
 
Leer más...

from Lo spazio intermedio

(testo di Margherita Hack da Pietro Musilli)

La storia delle donne nella cultura e nella vita civile è stata una storia di emarginazione fino alla fine dell'Ottocento e in gran parte ancora fino alla metà del Novecento, almeno nei paesi industrializzati. In molti paesi in via di sviluppo, salvo rare eccezioni, le donne sono ben lontane non solo dall'aver raggiunto la parità con l'altro sesso, ma anche dal vedere loro riconosciuti i più elementari diritti di esseri umani. Quali possono essere le cause di questa situazione che risale indietro nei secoli? Forse già nelle epoche preistoriche, la forza fisica necessaria per sopravvivere, le numerose gravidanze e il lungo periodo di allattamento e di cura della prole hanno portato alla differenziazione dei compiti. Oggi, i progressi della scienza e della medicina, e le conseguenti applicazioni tecnologiche hanno annullato la condanna biblica – uomo lavorerai con fatica, donna partorirai con dolore – almeno nei paesi industrializzati. Per secoli le donne che potevano avere accesso all'istruzione erano quelle rinchiuse nei conventi. Forse per questo le donne che sono emerse nel passato erano soprattutto umaniste, pittrici, scrittrici, poetesse, ma molto più raramente scienziate. Infatti chi ha attitudini artistiche o letterarie può emergere anche senza una preparazione specifica, mentre le scienze, e in particolare le cosiddette scienze “dure” come matematica e fisica richiedono una preparazione di base, senza la quale è quasi impossibile progredire. Solo quelle poche favorite dall'avere un padre, un fratello o un marito scienziato disposto a condividere le proprie cognizioni, potevano farsi una cultura scientifica. Basta ricordare che ancora all'inizio del XX secolo in molti paesi europei alle ragazze era precluso l'accesso alle università ed anche ai licei. Perciò le donne, escluse dalle università, escluse dall'educazione scientifica, sono emerse là dove potevano emergere. Così è sorto il pregiudizio secondo cui le donne sarebbero più adatte alle materie letterarie e linguistiche che non a quelle scientifiche. Le stesse ragazze crescono in mezzo a questi pregiudizi e se ne lasciano influenzare, e scelgono le facoltà umanistiche anche contro le loro naturali inclinazioni, contribuendo così a rafforzare i pregiudizi stessi. Comunque oggi cresce sempre di più il numero di ragazze che scelgono materie ritenute tipicamente maschili come ingegneria. Malgrado le difficoltà incontrate, non sono poche le scienziate che hanno portato importanti contributi allo sviluppo della scienza. La storia ci tramanda i nomi di alcune famose scienziate. Ce ne furono una ventina nell'antichità, fra cui emerge il nome della matematica Ipazia; solo una decina nel medioevo, soprattutto nei conventi, quasi nessuna tra il 1400 e il 1500, 16 nel 1600, 24 nel 1700, 108 nel 1800. Oggi solo nel campo dell'astronomia sono più di 2000, ed in ogni campo dei sapere le ricercatrici universitarie superano il 50%, con punte dell'80% nelle facoltà umanistiche, del 60% in quelle di scienze biologiche, dal 30 al 40% nelle scienze abiologiche, più dei 50% nelle matematiche, mentre sono ancora al di sotto dei 20% in facoltà come ingegneria e agraria. Fra le matematiche va ricordata la già citata Ipazia (370-415 d.C.), figlia del matematico e filosofo Teone. Diventò capo di una scuola platonica di Alessandria d'Egitto frequentata da molti giovani. Fu uccisa barbaramente da un gruppo di fanatici cristiani, forse anche perché tanta genialità matematica in una donna poteva sembrare indice di empietà. Nel 1700 Maria Gaetana Agnesi (1718-1799) fu la prima donna ad essere chiamata a ricoprire una cattedra universitaria, all'Università di Bologna, e Sophie Germain (1776-1831) fu una riconosciuta esperta di teoria dei numeri e di fisica. Nel XIX secolo ci sono numerose grandi matematiche, fra le quali emergono soprattutto Sofia Kovaleskaja (1850-1891), professore all'Università di Stoccolma, e Emmy Noether (1882-1935), fondatrice dell'Algebra moderna. Fra le matematiche italiane di questo secolo ricordo Pia Nalli (1866-1964) professore ordinario di analisi matematica all'università di Cagliari e poi di Catania; Maria Pastori (1895-1975) ordinario di Meccanica Razionale all'università di Messina, Maria Cibrario Cinquini (1905-1992), ordinario di Analisi matematica a Cagliari e professore emerito dell'università di Pavia, Maria Biggiogero Masotti ordinario di geometria presso il Politecnico di Milano. Fra le fisiche e le astrofisiche vanno ricordate, naturalmente Marie Sklodwska Curie (1867-1934), premio Nobel per la fisica nel 1903 e per la chimica nel 1911, e prima donna professore alla Sorbona e la figlia Irene Curie (1897-1956) premio Nobel per la chimica nel 1935; Lise Meitner (1878-1856) premio Nobel per la chimica nel 1935 la quale scopre il fenomeno della fissione nucleare ed è la prima donna ad avere una cattedra universitaria di fisica in Germania; Marie Goeppert Mayer (1906-1968) premio Nobel per la fisica nel 1963 per la sua teoria sui “numeri magici” che determinano la stabilità degli atomi; Wu Chieng-Shiung (1913-1997), professore di fisica alla Columbia University, scopritrice della non conservazione della parità nelle interazioni deboli. Fra le astronome e astrofisiche va ricordata Caroline Herschel (1750-1848) che insieme al fratello William iniziò lo studio fisico del cielo, occupandosi di quello sfondo di stelle fino allora considerato poco più di uno scenario su cui si muovevano i pianeti. A loro si deve lo studio delle nubi interstellari, la scoperta di regioni apparentemente prive di stelle, che oggi sappiamo essere regioni ricche di polveri che ci nascondono le stelle retrostanti, e lo studio della distribuzione delle stelle sulla volta celeste. Maria Mitchell (1818-1889) è stata la prima famosa astronoma americana, docente di astronomia al Vassar College e direttrice dell'osservatorio, che ha preso il suo nome. Un terzetto di astronome americane che hanno legato il loro nome a scoperte e ricerche fondamentali per la moderna astrofisica sono Henrietta Swan Leavitt (1868-1921), Anne Cannon (1863-1941) e Antonia Maury (1866-1952). La prima scoprì la relazione che lega il periodo di variazione di luce di una classe di stelle variabili dette “Cefeidi” al loro splendore assoluto, facendo di questa classe di stelle uno dei migliori mezzi per la determinazione delle distanze delle galassie. Alla seconda si deve la classificazione degli spettri di più di 225.000 stelle; il risultato del suo lavoro è raccolto nel poderoso catalogo “Henry Draper” (dal nome dei finanziatone dell'opera) che è ancora oggi largamente consultato. La terza scoprì alcune caratteristiche degli spettri stellari, che permettevano di stabilire lo splendore assoluto di una stella, e quindi – misurato lo splendore apparente – risalire alla distanza. Essa ha anticipato di almeno due decenni il metodo di determinazione delle distanze dal semplice studio dello spettro. Una grande astrofisica, iniziatrice dei metodi di studio delle atmosfere stellari e della determinazione della loro composizione chimica è stata Cecilia Payne Gaposchkin (1890-1979). Iniziatrice dello studio dell'evoluzione chimica della Galassia è stata una giovane astrofisica, scomparsa prematuramente, Beatrice Tinsley (1941-1981). Oggi sono numerosissime le astrofisiche di fama internazionale che guidano gruppi di ricerca nei più svariati campi, dalla fisica stellare alla cosmologia, e delle più svariate nazionalità. Si può stimare che in tutto il mondo rappresentino dal 25 al 30% di tutti gli astronomi e astrofisici. Altrettanto numerose sono le scienziate nel campo della biologia e delle scienze mediche, molte insignite di premio Nobel. Per tutte ricordiamo Rita Levi-Montalcini (1909) premio Nobel per la medicina nel 1986. Sebbene oggi i contributi delle donne alla scienza vengano riconosciuti, resta il fatto che le scienziate per emergere devono generalmente lavorare di più dei loro colleghi e devono ancora superare numerosi pregiudizi, che, contrariamente a quanto si crede, sono maggiori nei paesi anglosassoni che non in quelli latini. Spesso mi viene chiesto se ho incontrato molte difficoltà nel corso della mia vita scientifica. Ritengo che molti degli ostacoli di cui si lamentano parecchie ricercatrici dipende anche dall'educazione ricevuta che, almeno fino a qualche decennio fa, tendeva a fare delle bambine persone arrendevoli e servizievoli, poco combattive e desiderose di protezione. Oggi mi sembra che le cose vadano cambiando, la vita e l'educazione comune a bambini e bambine li lascia più liberi di sviluppare le proprie attitudini naturali, senza imporre loro condizionamenti dovuti al sesso. Io ho avuto la fortuna di avere una famiglia in cui babbo e mamma erano perfettamente eguali, si dividevano i compiti in piena parità, e che non mi hanno mai imposto comportamenti o giocattoli legati a stereotipi sessuali. Anche lo sport che ho praticato per parecchi anni mi ha aiutato a sviluppare quella competitività che e necessaria per riuscire nell'atletica come nella scienza, per vincere sportivamente, allenandosi e studiando e avendo la costanza di perseguire lo scopo di battere un record o di ottenere un risultato scientifico, senza scoraggiarsi davanti agli insuccessi, perseverando con costanza. Credo perciò che l'ambiente familiare in cui ho avuto la fortuna di nascere sia stato estremamente importante per darmi fiducia nelle mie possibilità, e per non provare complessi di inferiorità che ho spesso notato in colleghe della mia generazione e anche più giovani. Malgrado i grandi progressi fatti dalle donne, ci sono ancora notevoli disparità nel mondo del lavoro, della politica e della ricerca. Nelle università per esempio le ricercatrici sono ormai più della metà di tutti i ricercatori, ma appena si passa al livello superiore, quello dei professori associati, le donne sono meno del 30% e al più alto livello dei professori ordinari sono appena il 10%. In politica è a tutti nota la scarsa rappresentanza femminile alla Camera dei deputati e al Senato. Al governo dei comuni sono ancora una minoranza le donne sindaco, mentre sono frequenti gli assessorati alla cultura assegnati a donne, il che mi fa malignamente pensare quanta poca importanza i politici tendono ancora a dare alla cultura, ritenuta un trascurabile centro di potere locale. Quasi sempre si attribuisce questa scarsa presenza femminile nei livelli più alti all'impegno familiare, alle cure dei marito e dei figli, e si chiede un maggiore impegno dello stato nel fornire asili nido, scuole materne, scuole a tempo pieno. Giustissimo! Però rarissimamente si afferma il diritto delle donne e il dovere degli uomini di dividersi al 50% le cure familiari, dalle più umili alle più importanti, anche se la legislazione familiare dà alle donne la possibilità di rivendicare questa reale parità. Sta alle giovani donne educare i propri compagni e ai giovani uomini di incitare le loro compagne ad affermarsi nella vita. Comunque ritengo che il crescente numero di donne affermate nella scienza, nella politica, nello sport e in tutti i campi dell'attività umana fornisca quei modelli che finora mancavano alle bambine, e che possono dar loro fiducia e stimoli ad eguagliarle.

 
Read more...

from 工人日记

工位骚话时间

J:来,吃。(分发零食) Z:你先给的B,这说明你的真爱是B。 J:不,实际上第一个分到的是P。 B:这顺序很重要吗? J:Z就是因为我没第一个给就吃醋了,Z心里有我。 办公室里顿时充满了快活的空气。

 
阅读更多

from manunkind

différance (the digital machine bursts on the scene)

the ubiquitous screen showsays: is GPT-3 aut.of(r)iction aut.onomous th e(e) possible of(f) the machine in vent i on

(in?vain)

it writes lies (from the imagined lives multiple,but,binary

and between a 0 and a 1 the critic lies, unwritten, in the shapeshade of a

?

 
En savoir plus...

from Parole alate

Troppe ferite di parole sconnesse dagli atti E di atti divisi dal cuore Mi rinchiudono in un'armatura di doloroso silenzio

I trasporti, il calore, gli abbandoni Per chi scalerà i muri delle mie paure E attraverserà il fossato della mia solitudine

Vergine di ferro

 
Continua...

from veer66

(Posted on 2022-05-10)

I try to convert C-style for-loop in JS to Common Lisp's loop macro for a learning purpose.

for (i=0; i<10; i++) {
  console.log(i)
}

Above JS code can be converted to:

(loop with i = 0
      unless (< i 10) return nil
      do (print i)
      do (incf i))

And, of course, the version below is more appropriate.

(loop for i from 0 below 10 do
    (print i))

The first version looks more flexible in applying to another problem than the last one.

 
Read more...

from veer66

(Posted on 2022-05-09)

In static1.lisp:

(defpackage static1 
 (:use #:cl)) 
(in-package :static1) 

(declaim (ftype (function (string string) string) concat-strings)) 
(defun concat-strings (a b)
  (format nil "~A --- ~A" a b)) 

(declaim (ftype (function (fixnum fixnum) string) concat-nums)) 
(defun concat-nums (a b)
  (concat-strings a b))

Then I ran this command:

sbcl --noinform --eval '(compile-file "static1.lisp")' --quit

SBCL showed this warning:

; caught WARNING: 
;  Derived type of STATIC1::A is 
;    (VALUES FIXNUM &OPTIONAL), 
;  conflicting with its asserted type 
;    STRING. 
;  See also: 
;    The SBCL Manual, Node "Handling of Types"

So SBCL – a Common Lisp implementation, can check type in compile-time. Anyway, a programmer needs to read warnings.

 
Read more...

from veer66

(Posted on 2022-04-25)

Last week, I watched a video about coding and Docker configuration on a TV. I couldn't read any line of code. Then I thought about visually impaired people. How do they code? Every student in Thailand must learn to code. I presume the situation is similar in every country.

People widely use text-to-speech services these days. I cannot find any text-to-speech service for reading source code aloud. Let's assume we have a modified version of a text-to-speech service.

So I looked at source codes in different programming languages on the CodeRosetta website. I perceive Python code blocks by their visual structure purely. To read Python source code, I have to encode its visual structure, namely indents to sounds. Reading a nested code block won't be easy to understand. For example, reading twelve leading white spaces aloud will be very strange. In Lisp, reading open parenthesis and close parenthesis is more straightforward, but I will forget which parenthesis. So the best form of code blocks is in QuickBasic, which has different keywords between different kinds of blocks. For example, FOR with NEXT, and IF with END IF. Later I got a comment from Lemmy.ml, which told me that Ada also has different keywords between different kinds of blocks. Another idea from Lemmy.ml is the reader must convert the Python code block into a similar form as Ada or QuickBasic before reading.

MBasic refers to code by line numbers instead of code blocks. However, by listening to five lines, I forgot the line number. For example, when I heard gosub 70, I forgot what was at line 70.

In X86 Assembly, a programmer labels only the line that the program will jump to it. So X86 Assembly code looks much better than MBasic.

Still, coding in X86 Assembly can be exhaustive in many cases. For example, X86 Assembly doesn’t support recursion. Writing quick sort in X86 Assembly can be too difficult for learning to code.

Haskell doesn’t rely on code blocks. However, reading the symbols, for example, >>= is challenging. Prolog’s symbols are easy to read. For example, we can read :– as IF. Anyway, the Prolog programming paradigm is different from the mainstream one now. So Erlang, whose syntax is similar to Prolog, is a more practical alternative.

In brief, Erlang is a practical, less visual-centric program language. Because it mostly relies on names instead of code blocks, reading names aloud is much easier than reading code blocks aloud. Furthermore, the Erlang programming paradigm is more mainstream now.

 
Read more...

from veer66

(Posted on 2022-04-20)

According to this thread, I compared using only lazy sequences with transducers.

To add the I/O factor, I prepared a data file called “fake.txt” using the program below:

(with-open [w (io/writer "fake.txt")]
  (doseq [n (range 10000000)]
    (.write w (str n "\n"))))

F1 is the lazy-sequence-based version. It reads data from “fake.txt” and does a few steps of computations.

(defn f1
  []
  (with-open [r (io/reader "fake.txt")]
    (->> (line-seq r)
         (map parse-long)
         (map inc)
         (filter even?)
         (map inc)
         (reduce + 0))))

F2 is the transducer-based version of F1.

(defn f2
  []
  (with-open [r (io/reader "fake.txt")]
    (transduce (comp (map parse-long)
                     (map inc)
                     (filter even?)
                     (map inc))
               +
               (line-seq r))))

I evaluated them using Criterium.

(with-progress-reporting (quick-bench (f1) :verbose))
(with-progress-reporting (quick-bench (f2) :verbose))

Here is the result.

#################### F1 ###################
Evaluation count : 6 in 6 samples of 1 calls.
Execution time sample mean : 3.811858 sec
Execution time mean : 3.812064 sec

#################### F2 ###################
Evaluation count : 6 in 6 samples of 1 calls.
Execution time sample mean : 1.490624 sec
Execution time mean : 1.490777 sec

F1, which is the lazy sequence version, took 3.812064 seconds. F2, which is the transducer version, took 1.490777. So the transducer version is 155.71% faster than the lazy sequence version.

In brief, this biased experiment shows the transducer version is much faster than the pure lazy sequence version.

 
Read more...