<?xml version="1.0"?>
<!-- name="generator" content="blosxom/2.0.2" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>Kroger's weblog   </title>
    <link>http://kroger.lisp-br.org/cgi-bin/blosxom</link>
    <description>A blog about free software, programming and music</description>
    <language>en</language>

  <item>
    <title>Nerd test</title>
    <link>http://kroger.lisp-br.org/cgi-bin/blosxom/2008/05/11#nerd-test</link>
    <description>
Eu acabei de fazer a nova versão do nerd test. Esse foi o resultado:
&lt;p&gt;
&lt;a href=&quot;http://www.nerdtests.com/nt2ref.html&quot;&gt;
&lt;img src=&quot;http://www.nerdtests.com/images/badge/nt2/21042a2c8a7e2976.png&quot; alt=&quot;NerdTests.com says I'm a Nerd King.  What are you?  Click here!&quot;&gt;
&lt;/a&gt;</description>
  </item>
  <item>
    <title>Paranóia nunca é demais</title>
    <link>http://kroger.lisp-br.org/cgi-bin/blosxom/2008/05/10#backup-online</link>
    <description>
Depois que li o livro &lt;a
href=&quot;http://safari.oreilly.com/1565926420&quot;&gt;Unix Backup and
Recovery&lt;/a&gt; eu fiquei extremamente paranóico com backups. Eu faço
cópias de segurança periodicamente para DVDs de &lt;a
href&quot;http://www.digitalfaq.com/media/dvdmedia.htm&quot;&gt;boa qualidade&lt;/a&gt;
além de fazer uma cópia de todo meu $HOME para um disco rígido
externo.

&lt;p&gt;Essas medidas, além de me fazerm dormir melhor a noite, protegem
meus dados contra possíveis problemas no meu computador. Contudo elas
são ineficientes se um desastre maior acontecer onde guardo as mídias
(incêndio, inundação, mofo, roubo, queda de meteoro, [coloque aqui sua
catastrofe preferida]). E isso pertuba o meu sono :-)

&lt;p&gt;Uma solução prática para isso é enviar as mídias de backup para um
lugar seguro. Como eu ainda não achei um lugar para isso na cidade
onde moro, resolvi experimentar um serviço de backup online. Para a
minha surpresa, a maioria dos serviços que vi é nerd-unfriendly. Esses
serviços necessitam de programas gráficos e propietários instalados na
maquina do cliente. Esqueça.

&lt;p&gt;O &lt;a href=&quot;http://www.rsync.net/&quot;&gt;rsync.net&lt;/a&gt; é a solução
perfeita para os meus problemas. Ele é bem nerd-friendly, tem um
suporte ótimo, aceita backups com rsync em um linha encriptada. Além
disso os backups podem ser armazenados encriptados.</description>
  </item>
  <item>
    <title>Carta favorita</title>
    <link>http://kroger.lisp-br.org/cgi-bin/blosxom/2007/09/12#carta-favorita</link>
    <description>
&lt;p&gt;Eu sou um grande fã de Richard Feynman. Depois de ler, reler e
reler o
delicioso &lt;a href=&quot;http://www.amazon.com/Surely-Feynman-Adventures-Curious-Character/dp/0393316041/ref=pd_bbs_sr_2/105-6915001-9383665?ie=UTF8&amp;s=books&amp;qid=1188465451&amp;sr=8-2&quot;&gt;Surely
You're Joking, Mr. Feynman!&lt;/a&gt;, e
ler &lt;a href=&quot;http://www.amazon.com/What-Care-Other-People-Think/dp/0393320928/ref=pd_bbs_sr_4/105-6915001-9383665?ie=UTF8&amp;s=books&amp;qid=1188465451&amp;sr=8-4&quot;&gt;What
Do You Care What Other People Think?: Further Adventures of a Curious
Character&lt;/a&gt;, &lt;a href=&quot;http://www.amazon.com/No-Ordinary-Genius-Illustrated-Richard/dp/039331393X/ref=sr_1_29/105-6915001-9383665?ie=UTF8&amp;s=books&amp;qid=1188465491&amp;sr=8-29&quot;&gt;No
Ordinary Genius: The Illustrated Richard
Feynman&lt;/a&gt;, &lt;a href=&quot;http://www.amazon.com/Genius-Life-Science-Richard-Feynman/dp/0679747044/ref=sr_1_46/105-6915001-9383665?ie=UTF8&amp;s=books&amp;qid=1188465519&amp;sr=8-46&quot;&gt;Genius:
The Life and Science of Richard Feynman&lt;/a&gt;, provavelmente minha
citação favorita dele vem do livro com suas cartas
em &lt;a href=&quot;http://www.amazon.com/Perfectly-Reasonable-Deviations-Beaten-Track/dp/0738206369&quot;&gt;Perfectly
Reasonable Deviations From The Beaten Track: The Letters Of Richard P.
Feynman&lt;/a&gt;.

&lt;p&gt;Feynman gostava muito de percussão e sempre se irritava quando as
  pessoas achavam curioso um cientista famoso gostar de algo
  artístico. Quando um editor escreveu pedindo uma fotografia dele
  tocando tambor para dar uma &quot;abordagem humana para a apresentação da
  dificuldade que a física teórica representa&quot;, Feynman respondeu:

&lt;pre&gt;
Caro Sr,

O fato que eu toco percussão não tem nada a ver com o fato que eu faço
física teórica. Física teórica é uma atividade humana, um dos maiores
desenvolvimentos dos seres humanos, e o desejo perpétuo de provar que
pessoas que fazem isso [física teórica] são humanos mostrando que eles
fazem outras coisas que alguns outros humanos fazem (como tocar bongô)
é insultante para mim.

Eu sou humano o suficiente para dizer para você ir para o inferno.

Atenciosamente,
RPF
&lt;/pre&gt;</description>
  </item>
  <item>
    <title>Lisp e parênteses</title>
    <link>http://kroger.lisp-br.org/cgi-bin/blosxom/2007/08/23#lisp-e-parenteses</link>
    <description>
As pessoas sempre reclamam da quantidade de parênteses em Lisp.
Contudo elas falham em perceber que outras linguagens tem tantos
elementos sintáticos quanto lisp, ou até mais, só que como eles são
diferentes entre si ficam &quot;espalhados&quot; pelo código não dando uma
sensação tão presente como os parênteses de Lisp. Como um exemplo
simples, comparemos uma função simples e não otimizada para calcular
números de fibonacci em Pascal e em Common Lisp:

O código em Pascal:

&lt;pre&gt;
function fib(N : integer) : integer;
begin
  if N &lt; 2 then 
    fib := N;
  else
    fib := fib (N - 1) + fib (N - 2);
end;
&lt;/pre&gt;

O código em Lisp:
&lt;/pre&gt;&lt;pre&gt;
(defun fib (n)
  (if (&lt; n 2)
      n
      (+ (fib (- n 1))
         (fib (- n 2)))))
&lt;/pre&gt;

A primeira vista o código em Lisp parece mais &quot;poluído&quot;, com inúmeros
parênteses, né? Bom, se excluirmos todas as coisas que o código em
Pascal tem em comum com o código em Lisp (por exemplo,
&lt;tt&gt;function&lt;/tt&gt; é equivalente a &lt;tt&gt;defun&lt;/tt&gt;, &lt;tt&gt;if&lt;/tt&gt;,
&lt;tt&gt;+&lt;/tt&gt;, e &lt;tt&gt;-&lt;/tt&gt; tem em ambos, etc) deixamos somente os
elementos sintáticos que Pascal tem mas Lisp não precisa, teremos algo
como:

&lt;/pre&gt;&lt;pre&gt;
: integer : integer ;
begin
then
fib :=
else
fib := ;
end;
&lt;/pre&gt;

Ou seja, 15 elementos sintáticos. Por outro lado, se fizermos o mesmo
com Lisp, isso é, tirarmos tudo que o código Lisp tem em comum com o
código em Pascal, vamos terminar com isso:

&lt;pre&gt;
(
(()
(()())))
&lt;/pre&gt;

ou seja, um total de 12 elementos sintáticos. Não apenas o código em
Lisp tem &lt;em&gt;menos&lt;/em&gt; elementos sintáticos, como eles são uniformes
(apenas parênteses), enquanto o código em Pascal tem vários elementos
diferentes que o programador tem que se lembrar.

Esse é um ponto-chave ao se programar em Lisp; na superfície parece
que a linguagem é inundada de parênteses, mas no fundo, o número de
elementos sintáticos é o mesmo, ou até menor, que a maioria das
linguagens. Com a vantagem de que os elementos sintáticos usados são
mais uniformes (apenas parênteses), enquanto que outras linguagens
usam diversas coisas como parênteses, virgulas, pontos, colchetes,
etc.</description>
  </item>
  <item>
    <title>Comandos mais usados</title>
    <link>http://kroger.lisp-br.org/cgi-bin/blosxom/2007/05/26#comandos-mais-usados</link>
    <description>
O comando abaixo permite ver de maneira simples quais os comandos que
você executa mais frequentemente no linux:

&lt;pre&gt;
history | awk '{print $2}' | awk 'BEGIN {FS=&quot;|&quot;} {print $1}'| \
        sort | uniq -c | sort -rn| head -10 
&lt;/pre&gt;

Só por diversão é comum alguns hackers verificarem seus comandos mais
comuns e postarem em algum lugar.
O &lt;a
href=&quot;http://nosleepforyou.blogspot.com/2007/05/comandos-mais-usados-e-algumas-dicas.html&quot;&gt;Dorneles&lt;/a&gt;
postou seus comandos mais comuns, e de quebra mostrou uma
implementação em Python.
&lt;p&gt;
Como Lisp não é (erroneamente) considerada uma linguagem apropriada
para escrever scripts de sistema eu gosto de fazer uma uma versão em
Lisp de scripts como esse para ver como ela se sai. A minha
implementação pode ser vista abaixo. Eu usei apenas ANSI Common Lisp.
Se eu tivesse usado bibliotecas externas o código poderia ser ainda
mais compacto.

&lt;pre&gt;
(defun get-comandos ()
  (with-open-file (stream &quot;/home/kroger/.bash_history&quot;)
    (loop for line = (read-line stream nil nil) while line
       collect (subseq line 0 (position #\Space line)))))

(defun conta-itens ()
  (let ((comandos (get-comandos)))
    (mapcar (lambda (item) (list (count item comandos :test #'string=) item))
            (remove-duplicates comandos :test #'string=))))

(format t &quot;~{~{~a ~}~%~}&quot; (sort (conta-itens) #'&gt; :key #'first))
&lt;/pre&gt;

O objetivo aqui não é, naturalmente, fazer uma comparação com python
(no estilo &quot;minha linguagem é melhor que a sua&quot;), mas sim ver como
Lisp se sai nesse tipo de coisa. Eu acho que o resultado foi bem
satisfatório. Lisp não tem nenhum comando padrão para ler todo o
arquivo em uma string, mas dá para fazer isso com apenas 2 linhas de
código. A função &lt;tt&gt;count&lt;/tt&gt; conta quantas vezes um item aparece em
uma sequencia, de modo que foi possivel implementar o código para
contar os elementos de uma maneira funcional.
&lt;p&gt;
Um pouco de estatísticas: a implementação de python tem 14 linhas e 46
caracteres, enquanto a implementação em lisp tem 10 linhas e 52
caracteres. A implementação em lisp é mais curta, porém mais densa.
&lt;p&gt;
Eu não tenho dúvidas que é possível escrever um código em python ainda
menor, mas como eu disse anteriormente, esse não é o objetivo aqui.
Meu objetivo foi mostrar como é possível escrever um código simples,
curto, e elegante em Lisp para lidar com coisas corriqueiras do
dia-a-dia.</description>
  </item>
  </channel>
</rss>
