<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Codemountain, Paulo Suzart&#039;s Blog</title>
	<atom:link href="https://codemountain.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://codemountain.wordpress.com</link>
	<description></description>
	<lastBuildDate>Wed, 28 Mar 2012 00:45:55 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='codemountain.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://secure.gravatar.com/blavatar/9be4945e9043e11d7f82366a90ae8cc02d849b404052691fb0094695877f49c3?s=96&#038;d=https%3A%2F%2Fs0.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Codemountain, Paulo Suzart&#039;s Blog</title>
		<link>https://codemountain.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://codemountain.wordpress.com/osd.xml" title="Codemountain, Paulo Suzart&#039;s Blog" />
	<atom:link rel='hub' href='https://codemountain.wordpress.com/?pushpress=hub'/>
	<item>
		<title>Blog sendo desativado</title>
		<link>https://codemountain.wordpress.com/2012/03/28/blog-sendo-desativado/</link>
					<comments>https://codemountain.wordpress.com/2012/03/28/blog-sendo-desativado/#respond</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Wed, 28 Mar 2012 00:45:55 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=933</guid>

					<description><![CDATA[Para o que vem seguindo o blog e tem notado que não posto por aqui, visite meu blog definitivo: http://paulosuzart.github.com/. Desde o início do ano decidi mudar para o github e postar apenas em inglês. Este blog ficará no ar pois ainda recebe muitos visitantes. Agradeço aos leitores e os aguardos no novo blog. &#160; [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Para o que vem seguindo o blog e tem notado que não posto por aqui, visite meu blog definitivo: <a href="http://paulosuzart.github.com/">http://paulosuzart.github.com/</a>. Desde o início do ano decidi mudar para o github e postar apenas em inglês.</p>
<p>Este blog ficará no ar pois ainda recebe muitos visitantes. Agradeço aos leitores e os aguardos no novo blog.</p>
<p>&nbsp;</p>
<p>Abraços!</p>
<p>&nbsp;</p>
<p>Paulo Suzart. <a title="http://twitter.com/paulosuzart" href="http://twitter.com/paulosuzart">@paulosuzart</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2012/03/28/blog-sendo-desativado/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>Twitter Finagle, primeiras impressões</title>
		<link>https://codemountain.wordpress.com/2011/10/14/twitter-finagle-primeiras-impressoes/</link>
					<comments>https://codemountain.wordpress.com/2011/10/14/twitter-finagle-primeiras-impressoes/#respond</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Fri, 14 Oct 2011 17:04:27 +0000</pubDate>
				<category><![CDATA[scala]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=917</guid>

					<description><![CDATA[Quanto tempo sem postar sobre Scala! Mas isso não significa que fiquei sem estudar a linguagem e muito do que gira ao seu redor. Neste Post, vou colocar alguma scoisas sobre o Twitter Finagle, auto entitulado como uma biblioteca para construção de servidores e clientes RPC assíncronos em Java, Scala ou qualquer coisa que execute [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Quanto tempo sem postar sobre <a href="www.scala-lang.org" target="_blank">Scala</a>! Mas isso não significa que fiquei sem estudar a linguagem e muito do que gira ao seu redor. Neste Post, vou colocar alguma scoisas sobre o <a href="twitter.github.com/finagle/" target="_blank">Twitter Finagle</a>, auto entitulado como uma biblioteca para construção de servidores e clientes RPC assíncronos em Java, Scala ou qualquer coisa que execute na JVM.</p>
<p>O finagle é uma camada muuuuuito fina em cima do <a href="www.jboss.org/netty/" target="_blank">JBoss Netty</a>, que é um framework Java NIO realmente surpreendente e sabidamente veloz. O Netty é a base para o Aleph (<a href="http://clojure.org" target="_blank">clojure</a>), framework que <a title="Stream Server com Clojure e Aleph" href="https://codemountain.wordpress.com/2011/08/15/stream-server-com-clojure-e-aleph/" target="_blank">postei outro dia</a>.</p>
<p>Aqui vai um hello world tosco com o Finagle:</p>
<pre class="brush: scala; title: ; notranslate">
class SimpleService extends Service[HttpRequest, HttpResponse] {
  def apply(request: HttpRequest): Future[HttpResponse] = {
    val response = new DefaultHttpResponse(HTTP_1_1, Ok)
    Future.value(response)
  }
}
</pre>
<p>A coisa é simples. Service é uma classe do finagle que extende uma função que recebe um <code>HttpRequest</code> do netty e retorna um <code>Future[HttpResponse]</code>. Future é uma estrutura para programação assíncrona fantástica, mas talvez seja assunto para outro post. No exemplo acima, a única coisa que o servidor faz é responder um <code>200</code> para o cliente.</p>
<p>E sim, se eu quiser saber os parâmetros de uma query <code>string</code> ou mesmo de um formulário submetido, teria que fazer tudo isso manualmente. Para isso o finagle traz uma pequena abstração em cima do <code>HttpRequest</code> do Netty, é o Request. Nela é possível encontrar funções mais civilizadas e algumas outras facilidades como gerar o response a partir da requisição, aproveitando então seu encoding, versão http, etc. Uma versão mais interessante usando algumas classes providas no finagle é a seguinte:</p>
<pre class="brush: scala; title: ; notranslate">
class AdvancedService extends Service[Request, Response] {
  def apply(request: Request): Future[Response] = {
    (Path(request.path)) match {
      case Root / &quot;user&quot; / Integer(id) =&gt;
        val response = request.response
        response.setContentString(&quot;The user id is %d\n\n&quot; format id)
        Future.value(response)
    }
  }
}
</pre>
<p>Aqui aparecem algumas coisas interessantes. A classe <code>Path</code> permite extrair os conhecidos <code>Path Parameters</code> em um <code>pattern match</code>, que no caso pega o caminho imediatamente após <code>/user</code>. Se requisitarmos <code>/user/21</code>, a resposta do servidor apresentará o identificador repreentado no path. O pacote http.path do finagle possui outras facilidades para parâmetros em query string e métodos Http. Acabei usando em um pequeno trabalho pessoal para facilitar as coisas.</p>
<p>Mas espera! Tem muito código aqui. Então por que não reduzir essa coisa toda? Eu queria chegar ao ponto de apenas entregar uma função parcialmente aplicada que fizesse um match na requisição para saber seu HTTP VERB. Se for o que desejo tratar, então faço um <code>pattern mach</code> nos seus parâmetros para seguir com o processamento. Pode ficar assim:</p>
<pre class="brush: scala; title: ; notranslate">

val superAd = ~~ {
  case (Get, request) =&gt;
    (Path(request.path)) match {
       case Root / &quot;user&quot; / Integer(id) =&gt;
            val response = request.response
            response.setContentString(&quot;The user id is %d\n\n&quot; format id)
            Future.value(response)
    }
}
</pre>
<p>Wow! Bem melhor.E fiz isso com uma minuscula abstração que é a seguinte:</p>
<pre class="brush: scala; title: ; notranslate">
  val methNotAllwd: PartialFunction[(HttpMethod, Request), Future[Response]] = {
    case (_, request) =&gt;
      val response = request.response
      response.status = MethodNotAllowed
      Future.value(response)
  }

  def ~~(body: PartialFunction[(HttpMethod, Request), Future[Response]]) = {
    new Service[Request, Response] {
      def apply(request: Request): Future[Response] = {

        val pf: PartialFunction[(HttpMethod, Request), Future[Response]] = {
          body orElse methNotAllwd
        }
        pf(request.method, request)
      }
    }

  }
</pre>
<p>Além de poder usar a função <code>~~</code> para tratar minhas requisições, caso o método da requisição não tenha um pattern definido, será retornado um 405 para o cliente. Prefiro abstrações pequenas à mega abstrações que custumávamos fazer há uns 8 anos atrás. Tinhamos quase que um framework caseiro em cima de qualquer outro framework que usávamos.</p>
<p>Para executar um servidor http com o <code>superAd</code> atendendo as requisições, use o codec <code>RitchHttp</code> ao invés do Http puro.</p>
<p>Aqui falei muito rapidamente da parte Http para o lado servidor do Finagle, mas existe uma gama de features muito legais. Uma delas é a possibilidade de encadear filtros na requisição, semelhante aos filtros Servlet. No código de exemplo deste post, você pode ver que usei o ExceptionFilter que já vem no finagle. Ele vai tratar qualquer exceção no seu código.</p>
<h3>Como estou usando o Finagle?</h3>
<p>Bem, construí um proxy <a href="http://aws.amazon.com/sqs/" target="_blank">SQS</a> para um projeto de um amigo. Ele precisa receber mensagens mas não pode tornar as suas filas públicas. Além disso, é preciso validar a mensagem e autenticar o usuário antes de permitir que a mensagem vá para a fila.</p>
<h3>Por que o Finagle?</h3>
<p>Eu realmente acredito que precisamos reaproveitar coisas boas. O finagle oferece uma camada fina sobre o netty, e por isto não precisamos de um container WEB ou Servido de aplicação JEE, etc. Todo o seu código vai rodar com o mínimo de camadas e num nível baixo de abstração, o que tende a ser mais performático. Além de tornar o netty com uma cara de Scala.</p>
<p>Outro ponto importante é que a construção de clients é tão simples quanto a criação de services. Além de poder em alguns casos usar outros protocolos (Thrift, TCP puro com codecs) e manter a mesma simplicidade.</p>
<p>O finagle &#8211; e quase todos os projetos open source do Twitter &#8211; pode fazer sua vida ficar mais fácil. Outro projeto que uso neste mesmo caso é Logging. Simples, direto e com cara de Scala.</p>
<p>O código do post pode ser baixado aqui no meu <a href="https://github.com/paulosuzart/hellofinagle" target="_blank">github</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/10/14/twitter-finagle-primeiras-impressoes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>Flowchart de apoio a escolha de tipos em Clojure</title>
		<link>https://codemountain.wordpress.com/2011/08/22/flowchart-de-apoio-a-escolha-tipos-em-clojure/</link>
					<comments>https://codemountain.wordpress.com/2011/08/22/flowchart-de-apoio-a-escolha-tipos-em-clojure/#comments</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Mon, 22 Aug 2011 18:34:19 +0000</pubDate>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[cloj]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=895</guid>

					<description><![CDATA[Muitas vezes fiquei em dúvida sobre qual forma de definição de tipos em Clojure utilizar. As opçõe são muitas: deftype, defrecord, reify, proxy, e gen-class e é fundamental um bom entendimento de cada uma delas para fazer a melhor escolha sua implementação. Foi aí que encontrei este post de Chas Emerick, um dos autores de Clojure Programming: Rough [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Muitas vezes fiquei em dúvida sobre qual forma de definição de tipos em <a href="http://clojure.org/" target="_blank">Clojure</a> utilizar. As opçõe são muitas: <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/deftype"><code>deftype</code></a>, <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/defrecord"><code>defrecord</code></a>, <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify"><code>reify</code></a>, <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/proxy"><code>proxy</code></a>, e <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/gen-class"><code>gen-class</code></a> e é fundamental um bom entendimento de cada uma delas para fazer a melhor escolha sua implementação.</p>
<p>Foi aí que encontrei <a href="http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/" target="_blank">este post</a> de <a href="http://cemerick.com/" target="_blank">Chas Emerick</a>, um dos autores de <a href="http://oreilly.com/catalog/0636920013754" target="_blank">Clojure Programming: Rough Cuts Version</a>. Este livro promete muito e não vejo a hora de tê-lo em mãos.</p>
<p>No post, Chas fala a respeito da tarefa de escolher o tipo certo e mostra um fluxo que ajuda e muito, não só entender os tipos, mas como fazer a melhor escolha. Depois de <a href="http://twitter.com/omasanori" target="_blank">OGINO Masanori</a> oferecer uma versão em Japonês, me ofereci para fazer uma tradução para português, e Chas aceitou. Assim você pode usar como Wall paper ou fazer impressão bem grande para deixar na parede mais próxima. Clique na imagem para ampliar.</p>
<p style="text-align:justify;"><a href="https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png" target="_blank"><img data-attachment-id="908" data-permalink="https://codemountain.wordpress.com/2011/08/22/flowchart-de-apoio-a-escolha-tipos-em-clojure/clj-flowchart2/" data-orig-file="https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png" data-orig-size="750,1088" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="flowchart" data-image-description="" data-image-caption="" data-medium-file="https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png?w=207" data-large-file="https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png?w=700" class="aligncenter size-full wp-image-908" style="border:0 none;" title="flowchart" src="https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png?w=700" alt=""   srcset="https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png?w=420&amp;h=609 420w, https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png?w=103&amp;h=150 103w, https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png?w=207&amp;h=300 207w, https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png 750w" sizes="(max-width: 420px) 100vw, 420px" /></a>Usando as próprias palavras do autor, a Zona de Interoperabilidade (ou &#8220;The &#8216;Interop Zone'&#8221;) do chart, agrega os seguintes casos:</p>
<blockquote>
<p style="text-align:justify;"><em>“The ‘Interop Zone’” demarcates use cases (e.g. needing to define multiple constructors) and forms (<code>proxy</code> and <code>gen-class</code>) that are exclusively the domain of Clojure’s JVM interoperability support. Using these forms is fine, but be aware that by doing so, you are stepping outside of Clojure’s “native” abstractions; unless you are defining a type for the express purpose of meeting interoperability requirements, one of Clojure’s simpler type-definition forms may suit your needs better. </em>(Chas Emerick)<em><br />
</em></p>
</blockquote>
<p>Eu já precisei usar um misto de Protocols, types e Proxy como você pode ver <a title="OO Funcional: Clojure, Coherence e JavaScript" href="https://codemountain.wordpress.com/2011/03/14/oo-funcional-clojure-coherence-e-javascript/">aqui</a>. Era justamente um caso de interoperabilidade com classe puramente Java, e obtive um ótimo resultado.</p>
<p>Espero que o flowchart seja útil para você também.</p>
<p><strong>Update 2011-11-17 07:46 pm UTC:</strong> Chas teve uma grande ideia! Ele criou um <a href="https://github.com/cemerick/clojure-type-selection-flowchart" target="_blank">repositório no Github</a> onde é possível contribuir com traduções para este chart, que é dos mais úteis que já vi. Ele me <a href="https://twitter.com/cemerick/status/137300282764836864" target="_blank">acionou pelo twitter</a> e tive o prazer em fazer a versão em Português para colocar no repo. O chart original estará publicado em seu livro <a href="http://clojurebook.com/" target="_blank">Clojure Programming</a> &#8211; que sai no final deste ano.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/08/22/flowchart-de-apoio-a-escolha-tipos-em-clojure/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>

		<media:content url="https://codemountain.wordpress.com/wp-content/uploads/2011/08/clj-flowchart2.png" medium="image">
			<media:title type="html">flowchart</media:title>
		</media:content>
	</item>
		<item>
		<title>Stream Server com Clojure e Aleph</title>
		<link>https://codemountain.wordpress.com/2011/08/15/stream-server-com-clojure-e-aleph/</link>
					<comments>https://codemountain.wordpress.com/2011/08/15/stream-server-com-clojure-e-aleph/#comments</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Mon, 15 Aug 2011 00:19:26 +0000</pubDate>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=879</guid>

					<description><![CDATA[Hoje vou ser objetivo e já começo com o código: E mais objetivo ainda eu digo: O Aleph é simplesmente sensacional! É um framework de comunicação assíncrona feito com o excelente JBoss Netty e um framework muito completo para programações baseada em eventos do mesmo autor do Aleph, o Lamina. O Lamina usa canais como [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Hoje vou ser objetivo e já começo com o código:</p>
<pre class="brush: clojure; title: ; notranslate">
(ns NewStream.core
	(:use [aleph.http])
	(:require [lamina.core :as l]
	          [beanstalk.core :as b]))

	(def beans (b/new-beanstalk &quot;192.168.0.105&quot; 11300))

	(defn init
		[ch]
		(l/receive-all ch (fn[_]))
		(future
			(loop [job (b/reserve beans)]
				(l/enqueue ch (:payload job))
				(b/delete beans (:id job))
				(recur (b/reserve beans)))))

	(defn handler
		[ch requet]
		(let [stream (l/named-channel :news-stream init)]
			(l/enqueue ch
				{:status 200
				 :headers {&quot;content-type&quot; &quot;text/html&quot;}
				 :body (l/fork stream)})))

	(defn -main[&amp; args]
		(start-http-server handler {:port 8089}))
</pre>
<p>E mais objetivo ainda eu digo: O <a href="https://github.com/ztellman/aleph">Aleph</a> é simplesmente sensacional! É um framework de comunicação assíncrona feito com o excelente <a href="http://www.jboss.org/netty/" target="_blank">JBoss Netty</a> e um framework muito completo para programações baseada em eventos do mesmo autor do Aleph, o <a href="https://github.com/ztellman/lamina/" target="_blank">Lamina</a>.</p>
<p>O Lamina usa canais como cidadãos de primeiro nível e compartilha o mesmo princípio de canais em <a href="http://golang.org/" target="_blank">Go</a>. Mas é muuuuuuito mais poderoso.</p>
<p>O código acima nasceu de um desafio lançado para <a href="http://twitter.com/abraaoisvi" target="_blank">@abraaoisvi</a>, <a href="http://twitter.com/lucastex" target="_blank">@lucastex</a>, <a href="http://twitter.com/rafaelfelini" target="_blank">@rafaelfelini</a> e eu (<a href="http://twitter.com/paulosuzart" target="_blank">@paulosuzart</a>). O desafio era fazer um servidor de stream de notícias de um dado evento sem usar websocket e algumas outras restrições que não vem ao caso.</p>
<p>Na minha solução, tenho um servidor <a href="https://github.com/kr/beanstalkd/" target="_blank">beanstalkd</a> rodando num linux. Este servidor recebe mensagens de uma aplicação usada por um editor de notícias fictícia (na verdade um código tosco em python meu mesmo). E cada cliente que conecta no Aleph, vai passar então a receber as notícias uma vez emitidas pelo editor.</p>
<p>O código acima tem <code>handler</code> como a função que recebe as requisições de um browser, por exemplo. Veja que nela, <code>stream</code> é um canal que recebe todas as mensagens vindas do beanstalkd. O detalhe é:news-stream que é o nome dado ao canal de mensagens. Isto é, existirá apenas um canal com este nome no servidor.</p>
<p><code>init</code> é a função que inicializa o canal <code>stream</code> (recebido como parâmetro <code>ch)</code>. Como a função <code>reserve</code> da lib <a href="https://github.com/bengl3rt/beanstalk" target="_blank">beanstalk</a> é blocking, executo ela em outra thread usando <code>future</code>, e a cada nova mensagem recebida, faço o <code>enqueue</code> no canal <code>stream</code>.</p>
<p>O http handler responde imediatamente para o Browser com status 200 OK, mas o <code>body</code> é um <code>channel</code> que sofreu um <code>fork</code> do canal <code>stream</code>. O <code>fork</code> permite que cada cliente receba uma cópia das mensagens de <code>stream</code> a partir do momento em que fez o <code>fork</code>. O Lamina se encarrega de repassar todas as mensages de <code>stream</code> para os canais gerados a partir do <code>fork</code>.</p>
<p>Com um <code>body</code> sendo um <code>channel</code>, o Aleph vai responder a requisição usando uma resposta <a href="http://en.wikipedia.org/wiki/Chunked_transfer_encoding" target="_blank">Chunked</a>.</p>
<p>Ao acessar <code>http://localhost:8089</code>, o Browser vai manter a conexão aberta. Cada nova mensagem emitida será então enviada imediatamente para cada browser pendurado no server. Simples assim <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Aleph + Lamina, ta aí uma boa combinação para tirar o máximo do seus processadores! Até a próxima.</p>
<p><strong>Update:</strong> Algumas pessoas me perguntaram como rodar este pequeno programa. Você pode usar o <a href="https://github.com/technomancy/leiningen/" target="_blank">Leiningen</a> com o seguinte <code>project.clj</code>:</p>
<pre class="brush: clojure; title: ; notranslate">

(defproject NewStream &quot;1.0.0-SNAPSHOT&quot;
  :description &quot;Simple news stream server&quot;
  :dependencies [[org.clojure/clojure &quot;1.2.1&quot;]
                 [lamina &quot;0.4.0-beta2-SNAPSHOT&quot;]
                 [aleph &quot;0.2.0-beta2-SNAPSHOT&quot;]
                 [org.clojars.bengl3rt/beanstalk &quot;1.0.2&quot;]]
  :main NewStream.core)
</pre>
<p>Depois é só executar <code>lein deps</code> e então <code>lein run</code>. Ah, não esquece de ter um Servidor beanstalkd rodando.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/08/15/stream-server-com-clojure-e-aleph/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>Golang &#8211; Templates e formatters</title>
		<link>https://codemountain.wordpress.com/2011/07/01/golang-templates-e-formatters/</link>
					<comments>https://codemountain.wordpress.com/2011/07/01/golang-templates-e-formatters/#respond</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Fri, 01 Jul 2011 07:30:53 +0000</pubDate>
				<category><![CDATA[golang]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=860</guid>

					<description><![CDATA[Adivinhou! Irei escrever: &#8220;Quanto tempo sem postar no blog!&#8221; É isso mesmo. Quanto tempo! Se você tem acompanhado meus tweets, deve ter notado que estou focado em Go. Bom, na verdade não estou twittando ou postando no blog sobre Go como fiz com Scala e Clojure por alguns motivos. Mas é proposital. Não aguentei me [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:justify;">Adivinhou! Irei escrever: &#8220;Quanto tempo sem postar no blog!&#8221; É isso mesmo. Quanto tempo!</p>
<p style="text-align:justify;">Se você tem acompanhado meus <a href="http://twitter.com/#!/paulosuzart">tweets</a>, deve ter notado que estou focado em <a href="http://golang.org/" target="_blank">Go</a>. Bom, na verdade não estou twittando ou postando no blog sobre Go como fiz com <a href="http://www.scala-lang.org/" target="_blank">Scala</a> e <a href="http://clojure.org/" target="_blank">Clojure</a> por alguns motivos. Mas é proposital.</p>
<p style="text-align:justify;">Não aguentei me segurar e segue uma dica sobre <a href="http://golang.org/pkg/template/" target="_blank">templates em Go</a>. Existem outras soluções, até mesmo mais simples, para o problema. Mas resolvi fazer dessa forma para não interferir nos dados da aplicação por questão de apresentação e visualização de dados.</p>
<pre class="brush: python; title: ; notranslate">
var CustomFormatter = template.FormatterMap{
    &quot;f2mi&quot;: func(w io.Writer, format string, value ...interface{}) {
                 fmt.Fprint(w, strconv.Ftoa64(value[0].(float64)/1000000, 'f', -1))
    },
    &quot;i2mi&quot;: func(w io.Writer, format string, value ...interface{}) {
        fmt.Fprintf(w, strconv.Ftoa64(float64(value[0].(int64))/1000000, 'f', -1))
    },
}

var OutPutTemplate = `
=========================================================================
Test Summary (gb. Version: 0.0.2 alpha)
-------------------------------------------------------------------------
Total Go Benchmark Time         | {Elapsed|i2mi} milisecs
Requests Performed              | {TotalSuc}
Requests Lost                   | {TotalErr}
Average Response Time           | {Avg|f2mi} milisecs
Max Response Time               | {Max|i2mi} milisecs
Min Response Time               | {Min|i2mi} milisecs
`
//The resunting summary of a master
type Summary struct {
    Start, End         int64
    TotalSuc, TotalErr int
    Min, Max           int64
    Avg                float64
    Elapsed            int64
}

func (self *Summary) String() string {
    t := template.MustParse(OutPutTemplate, CustomFormatter)
    sw := new(StringWritter)
    t.Execute(sw, self)
    return sw.s
}
</pre>
<p style="text-align:justify;">Wow! O que está acontecendo aqui? Bem, começando pela variável <code>OutPutTemplate</code>, temos o template usado no <a href="https://github.com/paulosuzart/gb" target="_blank">GoBenchmark</a> como saída no final do teste.</p>
<p style="text-align:justify;">Note que entre as chaves (<code>{}</code>) estão exatamente os campos da struct <code>Summary</code>, definida mais abaixo. a função <code>(self *Summary) String()</code> em Go, é o correspondente do método <code>.toString()</code> em Java. Ok? Acontece que os campos com <code>in64</code> estão guardando valores em nanosegundos. Mas para o usuário final desejo mostrar em milisegundos.</p>
<p style="text-align:justify;">E por que não dividir cada campo por 10 elevada à 6 potência? Realmente daria, mas precisaria cuidar disso no meu código da aplicação, e não quero isso.</p>
<p style="text-align:justify;">Uma solução é combinar ao template alguns formatadores de valor. Por isso a média (campo <code>Avg</code>) é representada no template por <code>{Avg|f2mi}</code>, isto é, <code>{Campo|formatador}</code>. Note que em <code>String()</code>, ao efetuar o parse do template eu uso o <code>CustomFormatter</code> para indicar quais os formatadores usados.</p>
<p style="text-align:justify;">É possível usar reflection para, em um mesmo formatador, decidir se o argumento value é um <code>int64</code> ou <code>float64</code>. Mas, prefiro deixar reflection pra situações realmente relevantes.</p>
<p>É isso! Os formatadores são boas opções e permite soluções criativas.</p>
<p>Se você não me segue no twitter, aproveite: <a href="http://twitter.com/#!/paulosuzart">@paulosuzart</a>. Até a próxima!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/07/01/golang-templates-e-formatters/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>Clojure + Coherence = Cloherence</title>
		<link>https://codemountain.wordpress.com/2011/04/03/clojure-coherence-cloherence/</link>
					<comments>https://codemountain.wordpress.com/2011/04/03/clojure-coherence-cloherence/#respond</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Sun, 03 Apr 2011 08:00:04 +0000</pubDate>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coherence]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=848</guid>

					<description><![CDATA[Que combinação! Datagrid Coherence e Clojure! O último post deu uma prévia da abstração simples em cima do Coherence que venho escrevendo. Na verdade não há nada demais nela, a não ser permitir o acesso aos caches e ao processamento de entradas no datagrid de forma mais natural em Clojure. O Cloherence permite duas semânticas, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Que combinação! <a href="https://github.com/paulosuzart/cloherence">Datagrid Coherence e Clojure</a>!  O último post deu uma prévia da abstração simples em cima do Coherence que venho escrevendo. Na verdade não há nada demais nela, a não ser permitir o acesso aos caches e ao processamento de entradas no datagrid de forma mais natural em <a href="http://clojure.org/">Clojure</a>.  O Cloherence permite duas semânticas, uma que é uma pequena DSL para operações de put, get, remove put de sequencias e processamento no cluster. Vamos a elas:</p>
<pre class="brush: clojure; title: ; notranslate">
    (def a1 {:name &quot;Nacho&quot; :breed &quot;Bulldog&quot;})
    (def a2 {:name &quot;Sushi&quot; :breed &quot;Shire&quot;})
    (with-cache &quot;dogs&quot;
        (put-val 1 a1)
        (println (get-val 1)))
;; put a1 into a named cache &quot;dogs&quot; and print the value get from 1
    (with-cache &quot;dogs&quot;
        (put-seq :name (list a1 a2)))
;; put a1 and a2 using :name as key
</pre>
<p>A função put-seq é interessante pra casos onde alguma função retorna uma lista, e esta pode ser &#8220;cacheada&#8221; de uma vez.  Acontece é que NamedCaches no Coherence são herdeiros de java.util.Map. E isso me deu a ideia de usar a mesma semântica de <a href="http://clojure.org/data_structures#Data%20Structures-Maps%20%28IPersistentMap%29">maps em clojure</a> para tratar os caches Coherence. E ficamos assim:</p>
<pre class="brush: clojure; title: ; notranslate">
    (cache-map cats)
    (assoc cats 1 {:name &quot;chico&quot; :breed :unknown})
    (get cats 1) ;; {:name &quot;chico&quot; :breed :unknown}
    (inplace-update cats 1
        (fn [e]
            {:name (.toUpperCase (:name e)) :breed &quot;none&quot;}))
;;put {:name &quot;CHICO&quot; :breed &quot;none&quot;} in the cache with key 1
</pre>
<p>inplace-update não existe em clojure. A lib oferece uma função update para se assemelhar à função update-in, com a diferença que não permite chaves encadeadas.</p>
<p>A função inplace-update emite um <a href="http://download.oracle.com/docs/cd/E15357_01/coh.360/e18814/com/tangosol/util/processor/AbstractProcessor.html">Entry Processor</a> para o grid, e no nó do DataGrid que reside a entrada, a função f é invocada com a entrada passada como argumento. A vantagem é não trazer para a JVM que emite o processador, a entrada encontrada. Escalando isso, livramos a JVM da aplicação de receber possíveis milhares de entradas do cache para efetuar a alteração nas entradas.</p>
<p>Vamos examinar o par EntryProcessor mais a função inplace-update:</p>
<pre class="brush: clojure; title: ; notranslate">

;;PProcess é do pacote .core

(deftype CljProcessor
    [f args] java.io.Serializable PProcessor
        (process [this entry]
	(apply f (.getValue entry) args)))

(defn inplace-update
    [cache e-key f &amp; args]
        (with-cache cache
        (process e-key (cloherence.maps.CljProcessor. f args))))
</pre>
<p>Aqui conto com a função process, com a própria DSL da lib with-cache e com o protocol PProcessor. f de inplace-update é executada assim que a entrada é encontrada, recebendo o valor como primeiro argumento e &amp;args como restante dos argumentos.</p>
<p>Bom, além de divertido, a lib cloherence se propõe a dar uma melhor aderência dos caches Coherence com Clojure. Como próximos passos (não sei se vou fazer, mas pretendo), pretendo implementar inplace-update para várias chaves, iplementar locks e utilizar primitivas de concorrência clojure para algumas operações no cache.</p>
<p>É isso, boa diversão!</p>
<p><a href="http://twitter.com/paulosuzart">@paulosuzart</a></p>
<p>P.S. Gostaria de um feedback pra saber que nível seria mais adequado abordar Clojure aqui no blog. As vezes sinto que estou escrevendo coisas sem ter feito uma base como fiz com os <a href="https://codemountain.wordpress.com/category/scala/">posts sobre Scala</a>. Quem quiser pode dar um feed. <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/04/03/clojure-coherence-cloherence/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>OO Funcional: Clojure, Coherence e JavaScript</title>
		<link>https://codemountain.wordpress.com/2011/03/14/oo-funcional-clojure-coherence-e-javascript/</link>
					<comments>https://codemountain.wordpress.com/2011/03/14/oo-funcional-clojure-coherence-e-javascript/#comments</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Mon, 14 Mar 2011 13:07:30 +0000</pubDate>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coherence]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=830</guid>

					<description><![CDATA[Nossa! Estou escrevendo cada vez menos. Isso me deixa um pouco triste. Mas é consequencia de algumas mudanças, até agora positivas. Durante o carnaval decidi implementar uma ideia que havia comentado com @danielamadei. É uma idea simples: Criar uma fina camada REST em cima do Coherence, expandindo assim sua aplicabilidade para além do Java, .Net [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nossa! Estou escrevendo cada vez menos. Isso me deixa um pouco triste. Mas é consequencia de algumas mudanças, até agora positivas.</p>
<p style="text-align:justify;">Durante o carnaval decidi implementar uma ideia que havia comentado com <a href="http://twitter.com/danielamadei">@danielamadei</a>. É uma idea simples: Criar uma fina camada REST em cima do Coherence, expandindo assim sua aplicabilidade para além do Java, .Net e C. Bom, o objetivo mesmo é estudar e aplicar o que tenho aprendido em algum caso que eventualmente pode se tornar útil. A mistura de Coherence com Clojure e Javascript motivou a elaboração do post e o título dele.</p>
<p style="text-align:justify;">O resultado foi: <a href="http://clojure.org">Clojure</a>, <a href="https://github.com/mmcgrana/ring">Ring</a>, <a href="http://www.mozilla.org/rhino/">Rhino</a> e <a href="https://github.com/cgrand/moustache">Moustache</a>. As libs contrib usadas foram: <a href="http://richhickey.github.com/clojure-contrib/duck-streams-api.html">Duck-streams</a>, <a href="http://richhickey.github.com/clojure-contrib/json-api.html">json</a> e <a href="http://richhickey.github.com/clojure-contrib/string-api.html">string</a>.</p>
<p style="text-align:justify;">Mas, antes tentei fazer uma coisa mais louca com <a href="https://github.com/ztellman/aleph">Aleph</a> e <a href="https://github.com/ztellman/lamina">Lamina</a>. Aleph é um framework de comunicação  assíncrono escrito sobre lamina e <a href="http://www.jboss.org/netty">JBoss Netty</a> criado pelo mesmo autor do Lamina. É interessante, mas o Aleph acabou se mostrando com um nível de maturidade insuficiente para o que queria fazer, embora fosse simples.</p>
<p style="text-align:justify;">Na lib que dei o nome de CoheREST, fiz a parte de inserção e busca pela chave. A parte mais interessante foi usar o Rhino pra executar funções Javascript submetidas via http para o servidor Ring. Bom, a abstração para acesso ao Coherence ficou assim:</p>
<pre class="brush: clojure; title: ; notranslate">
    (with-cache &quot;My-Cache&quot;
        (put-val 1 {&quot;name&quot; &quot;Paulo&quot; &quot;age&quot; 20}))
</pre>
<p style="text-align:justify;">É isso mesmo, basta esse código para iniciar, criar e inserir um Map com a chave 1 no cache de nome &#8220;My-Cache&#8221;. Analogamente, pare obter o valor, basta usar uma função chamada get-val. Mas isso foi só pra ilustrar como ficou a simples abstração.</p>
<p style="text-align:justify;">Ok! O Coherence tem uma feature muito interessante. Ao invés de pesquisar no cache uma certa quantidade de entradas, efetuar algum tipo de operação e depois submeter as mudanças ao cache, ele permite que o processamento seja emitido por todo o cache (EntryProcessor). Isto faz com que o processamento ocorra localmente &#8211; no nó do grid em que a entrada reside &#8211; sem onerar o nó emissor do processamento. Isto é obtido emitindo para o cache uma implementação de <a href="http://download.oracle.com/docs/cd/E15357_01/coh.360/e18814/com/tangosol/util/processor/AbstractProcessor.html">AbstractProcessor</a>.</p>
<p style="text-align:justify;">Para emitir um Entry Processor, é possível fazer como se faz para por ou resgatar uma entrada no cache:</p>
<pre class="brush: clojure; title: ; notranslate">
    (with-cache &quot;My-Cache&quot;
        (process 1 (coherest.processor.JSProcessor. some-js)))
</pre>
<p style="text-align:justify;">Só uma observação, nesta versão implementei a emissão de um EntryProcessor para uma única entrada, aqui com a chave 1. E agora começa a parte interessante. coherest.processor.JSProcessor é executado por um EntryProcessor (apresentado mais abaixo), e é ele quem executa javascript no cluster, desde que o javascript tenha o seguinte formato:</p>
<pre class="brush: jscript; title: ; notranslate">
    function(e) {//e é a entrada no cache
         e.age = e.age + 1;
         return e;
     }
</pre>
<p style="text-align:justify;">Isto é, caso a entrada seja encontrada, ela será passada no formato JSON para a função que pode alterar a entrada e retornar o resultado do processamento. Aqui o exemplo é um  simples incremento da propriedade age da entrada. A função é a string some-js passada na construção do JSProcessor. E é aqui que o OO funcional começa.</p>
<p style="text-align:justify;">JSProcessor é um type que implementa um Protocol (leia-se interface em clojure) que define apenas uma função: process. O Protocol e o type ficam assim:</p>
<pre class="brush: clojure; title: ; notranslate">
    (defprotocol PProcessor
        (process [this entry]))

    (deftype JSProcessor
		[^String script] java.io.Serializable PProcessor
		(process [this entry]
                       ;; Implementation went here))

</pre>
<p style="text-align:justify;">Simples, o Coherence vai invocar apenas o método process(entry) na Implementação de AbstractProcessor. Como o processor é espalhado pelo cluster, ele também precisa implementar Serializable. Mas no início do post falei que um EntryProcessor deve implementar AbstractProcessor, mas esta classe não apareceu em lugar nenhum aqui até agora. Acontece que por questões de design, meu Protocol PProcessor é na verdade invocado por uma implementação anonima de AbstractProcess. Esta implementação anonima é que contem a implementação do método process, que por sua vez se encarrega em a função process do JSProcessor, passando como argumento a entrada encontrada no cache. Veja como ficou:</p>
<pre class="brush: clojure; title: ; notranslate">
(defn make-processor
	&quot;Create a valid Coherence EntryProcessor from the PProcessor passed
	 as agurment&quot;
	[processor]
	(proxy [AbstractProcessor] []
	    (process [entry]
		(process processor entry))))
</pre>
<p style="text-align:justify;">Ufa! make-processor é uma função que recebe a instância de JSProcessor, cria um proxy de AbstractProcessor, onde sua implementação é justamente a invocação da função process nele passando a entrada encontrada. A implementação de AbstractProcessor não passa de uma porta de entrada para a invocação das funções definidas pelo PProcessor. E usar um Protocol para o carro chefe na execução de funções no cluster permite que criemos instâncias deste protocol que façam o que desejarmos. O JSProcessor no caso, usa o Rhino pra executar funões no grid.</p>
<p style="text-align:justify;">O CoheREST foi feito sem nenhuma intenção comercial, tão pouco para uso em ambiente corporativo. Isto por que ainda preciso verificar algumas questões de licença. Aí posso liberar o fonte no meu <a href="http://github.com/paulosuzart/">github</a>. O post já foi bastante longo e não pude entrar em detalhes sobre o CoheREST ou sobre o Ring e o Rhino sendo usado direto em Clojure. Mas fica uma deixa pra próximos posts.</p>
<p style="text-align:justify;">Bom, e aqui tivemos herança, programação com interfaces, etc, tudo em clojure, uma linguagem não orientada a objetos, mas que não nos limita em nada a usar conceitos OO. Obrigado e lembre-se: <a href="http://twitter.com/paulosuzart">@paulosuzart</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/03/14/oo-funcional-clojure-coherence-e-javascript/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>clojure + xml com saxon e xstandard</title>
		<link>https://codemountain.wordpress.com/2011/02/07/clojure-xml-saxon-xstandard/</link>
					<comments>https://codemountain.wordpress.com/2011/02/07/clojure-xml-saxon-xstandard/#respond</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Mon, 07 Feb 2011 12:00:00 +0000</pubDate>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=811</guid>

					<description><![CDATA[Outro dia no trabalho estava definindo alguns padrões de como um XSD deveria ser escrito. Coisas simples como formato de nomes de elements, complexTypes, se o XSD deveria ter targetNamespace e attributeFormDefault. Foi aí que surgiu a ideia de fazer um script em clojure que validasse isso em um dado XML e indicasse o que [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Outro dia no trabalho estava definindo alguns padrões de como um XSD deveria ser escrito. Coisas simples como formato de nomes de elements, complexTypes, se o XSD deveria ter targetNamespace e attributeFormDefault.</p>
<p>Foi aí que surgiu a ideia de fazer um script em clojure que validasse isso em um dado XML e indicasse o que está fora destes padrões. Claro, algo assim existe por aí. Mas não dá pra perder a oportunidade. Juntei algumas funções auxiliares em cima do <a href="https://github.com/pjt/saxon">Saxon</a>, um wrapper clojure do <a href="http://saxonica.com/">Saxon XSLT and XQuery Processor</a>. A ideia foi pegar a base do Saxon e usar de tal forma que eu pudesse aplicar algumas asserções a um documento XML.</p>
<p>Queria trabalhar com a idea de <em>assertions</em>. Elas, além do nome, seriam compostas por uma expressão xPath, uma mensagem de falha, uma segunda expressão xPath para localizar que atributo do nó sendo avaliado seria considerado como display-name e uma função de validação que receberá o nó sendo avaliado e simplesmente retornaria true ou false. O resultado foi uma pequena lib commitada no meu github: <a href="https://github.com/paulosuzart/xstandard">xstandard</a>.</p>
<p>Por questão de praticidade, escolhi uma estrutura de map par armazenar as informações de uma <em>assertion</em>. Ah, e pra tornar ainda mais prático, criei uma macro que ajuda a definir uma <em>assertion</em> assim:</p>
<pre class="brush: clojure; title: ; notranslate">
(defassertion element-name &quot;//xsd:element[@name]&quot;
  :msg &quot;element %s does not match [a-z].*.&quot;
  :validator (attr-matches &quot;name&quot; #&quot;[a-z].*&quot;)
  :display-name &quot;data(./@name)&quot;)
</pre>
<p>Esta <em>assertion</em> fará análise &#8211; através do validator &#8211;  de todo elemento do meu XSD cujo atributo name esteja presente. Ok, mas decidi agrupar as <em>assertions</em>, eu poderia eventualmente tratar grupos diferentes de formas diferentes ou usar  a saída delas de forma diferente. Por isso existe uma outra macro que me permite fazer assim:</p>
<pre class="brush: clojure; title: ; notranslate">

(defassertions *default-assertions*

  (defassertion element-name &quot;//xsd:element[@name]&quot;
    :msg &quot;element %s does not match [a-z].*.&quot;
    :validator (attr-matches &quot;name&quot; #&quot;[a-z].*&quot;)
    :display-name &quot;data(./@name)&quot;)

  (defassertion type-name &quot;//xsd:complexType[@name]&quot;
    :msg &quot;type %s does not match [A-Z].*Type.&quot;
    :validator (attr-matches &quot;name&quot; #&quot;[A-Z].*Type&quot;)
    :display-name &quot;data(./@name)&quot;)

  (defassertion element-form-default &quot;/xsd:schema&quot;
    :msg &quot;schema hasn't attr elementFormDefault=\&quot;qualified\&quot;&quot;
    :validator (attr-eq &quot;elementFormDefault&quot; &quot;qualified&quot;))

  (defassertion target-ns &quot;/xsd:schema&quot;
    :msg &quot;schema hasn't targetNamespace attr&quot;
    :validator (attr-present &quot;targetNamespace&quot;)))
</pre>
<p>Legal, agora temos um grupo de <em>assertions</em>. Mas como executá-las? Simples, basta passar o conjunto de <em>assertions </em>aqui chamado *default-assertions* para a função <em>run</em> provida pela lib. O que fica mais ou menos assim:</p>
<pre class="brush: clojure; title: ; notranslate">
  (xs/run *default-assertions* xs/*nss* xmldoc)
  ;; *nss* is provided by the lib with a default namespace prefixe for xml schema.
</pre>
<p>Por padrão a lib vai retornar o resultado do processamento em um map contendo o nome de cada <em>assertion</em>, o caminho para o nó analisado no xml, a linha no arquivo:</p>
<pre class="brush: clojure; title: ; notranslate">
{:assertion :element-name, :status false, :display-name Item,
 :details {:result-msg element Item does not match [a-z].*.,
           :line 25,
           :path /xs:schema/xs:element[1]/xs:complexType[1]/xs:sequence[1]/xs:element[3]}}
</pre>
<p>Note no código onde declarei todas as asserções, a função <em>attr-matches</em> sendo usada na <em>assertion type-name.</em> Ela recebe como parâmetro o nome do atributo do nó analisado e uma regex para verificar o formato do atributo. Note também que a função é executada no momento da montagem da assertion, pois ela retorna uma segunda função, que esta sim, receberá o nó analisado e fará a checkagem do formato. O código de attr-matches é:</p>
<pre class="brush: clojure; title: ; notranslate">
(defn attr-matches
  &quot;Validates the format of a given node `n` against `regex`.&quot;
  [attr regex]
  (fn [n]
    (not (nil? (re-matches regex (get-attr n attr))))))
</pre>
<p>Lindo, não? Bom, para se divertir mais no código basta acessar meu github.</p>
<p>Pra fechar, durante a criação desse projetinho tive a oportunidade de usar a <a href="http://www.jetbrains.com/idea/" target="_blank">IntelliJ IDEA</a>. Surpreendente! Muito boa e estável, sem falar do plugin clojure e leiningen muito bons. Ah, pra somar ao aprendizado, utilizei o <a href="https://github.com/fogus/marginalia" target="_blank">Marginalia</a> pra gerar a documentação do xcode, <a href="https://github.com/paulosuzart/xstandard/blob/master/docs/uberdoc.html" target="_blank">veja aqui</a>. Basta salvar o html e ver a doc do projeto de uma forma bem interessante. O Marginalia é um projeto do <a href="http://twitter.com/fogus" target="_blank">@fogus</a>.</p>
<p>Não esqueça de me seguir no twitter: <a href="http://twitter.com/paulosuzart" target="_blank">@paulosuzart</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/02/07/clojure-xml-saxon-xstandard/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>5 coisas para tornar o seu cérebro funcional</title>
		<link>https://codemountain.wordpress.com/2011/01/01/5-things-to-a-functional-brain/</link>
					<comments>https://codemountain.wordpress.com/2011/01/01/5-things-to-a-functional-brain/#comments</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Sat, 01 Jan 2011 15:58:40 +0000</pubDate>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[fp]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=774</guid>

					<description><![CDATA[Desde janeiro de 2009, no meu primeiro post sobre Scala, venho na verdade falando de um paradigma desafortunadamente não ensinado na maioria das universidades brasileiras: Programação Funcional. Se alguém tem/teve aulas de programação funcional na universidade por favor deixe o nome da instituição nos comments. O que percebi nestes dois anos de posts sobre programação funcional [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:justify;">Desde janeiro de 2009, no meu <a href="https://codemountain.wordpress.com/2009/01/22/scala-scala-scala/" target="_blank">primeiro post sobre Scala</a>, venho na verdade falando de um paradigma desafortunadamente não ensinado na maioria das universidades brasileiras: <a href="http://en.wikipedia.org/wiki/Functional_programming" target="_blank">Programação Funcional</a>. Se alguém tem/teve aulas de programação funcional na universidade por favor deixe o nome da instituição nos comments.</p>
<p style="text-align:justify;">O que percebi nestes dois anos de posts sobre programação funcional e duas (Scala e Clojure) das linguages que suportam este paradigma, é que muitos leitores sentem uma dificuldade em se livrar das suas raizes imperativas, e a syntax destas linguagems acabam ficando até como uma dificuldade em segundo plano.</p>
<p style="text-align:justify;">Por isso resolvi escrever este post compacto que serve mais como direcionamento para tornar o seu cérebro funcional. Aqui vão 5 coisas que vão ajudar o programador a atingir seu momento de iluminação funcional:</p>
<h2>1. Lambda Calculus</h2>
<p>Estude essa coisa. Lambda Calculos, em muito alto nível, é a raiz da programação funcional. Neste cálculo, tudo é uma função, inclusive os números naturais, as operações algébricas, etc. Este sistema formal, possui uma série de colorários e propriedades que vão embasar as linguagens de programação funcional. E não, eu não sou especialista em Lambda Calculus e estou longe de ter fôlego intelectual pra isso. Mas ver a introdução é um bom começo pra se sentir confortável.</p>
<h2>2. Diga &#8216;o quê&#8217;, não &#8216;como&#8217;</h2>
<p>Isto está bastante ligado a funções de alto nível (High-order functions). São aquelas funções que recebem funções como argumento e até mesmo retornam alguma função. Fortes exemplos de funções de alto nível são funções de mapeamento em listas. Ou seja, você tira da sua responsabilidade a iteração de uma sequencia e informa para a função de mapeamento, qual função você quer aplicar nos elementos da sequencia. Exemplo:</p>
<pre class="brush: clojure; title: ; notranslate">
(def numbers (range 5))
(map #(* % %) numbers);; obtem o quadrado de cada ítem da lista de 0 a 4.
</pre>
<p>Aqui podemos ver a funções de alto nível <em>map </em>em ação, esta é provavelmente a função mais utilizada e mais exemplificada na internet. Mas é realmente prática e fácil de entender a coisa. Simplesmente pedimos que seja aplicada a função anônima que multiplica cada ítem por ele mesmo. Esta: #(* % %). Não vemos um <em>for</em>, iterações ou coisas do gênero.</p>
<h2>3. Entenda funções parcialmente aplicadas</h2>
<p style="text-align:justify;">Elas são úteis. Você pode computar somente entradas pra uma função, mas ao invés de aguarda que você obtenha todas as entradas para ela, você pode começar a aplicar (invocá-la) com os parâmetros que você possue em mãos e passá-la a diante. Veja um exemplo: Usando o mesmo numbers acima, vamos computar a multipliação de cada ítem de 0 a 4 por algum número que ainda não conhecemos.</p>
<pre class="brush: clojure; title: ; notranslate">
(def partials (map #(partial * %) numbers)))
(map #(% 2) partials);; = (0 2 4 6 8 )
</pre>
<p style="text-align:justify;"><em>partial</em> também é uma função que recebe uma função (a função de multiplicação *) e um parâmetro para ser aplicado a esta função, no caso cada ítem da sequencia. <em>partials </em>é a minha lista de funções parcialmente aplicadas. Algo como: ((* 0 ?) (* 1 ?) (* 2 ?) (* 3 ?) (* 4 ?)). Wow! Interessante. A segunda funão no código acima aplica a função gerada na lista de <em>partials</em> ao 2. 2 é o número que gostariamos de multiplicar cada elemento de 0 a 4 inicialmente, lembra? Acredite, isso é útil demais e existem muitos frameworks usando fortemente funções parcialmente aplicadas.</p>
<h2 style="text-align:justify;">4. Imutabilidade é natural</h2>
<p>Este é o tópico que talvez tenha gerado o maior hype nesta história de programação funcional. O resultado foi um monte de final nas variáveis em java, na esperança de isso ser suficiente para programar funcional ou garantir alguma imutabilidade. Na verdade de nada adianta colocar <em>final </em>na variável da classe, digamos, Pessoa e todos os seus atributos não serem final. E aí vem: Mas clonar a cada <em>set</em> vai custar memória? Vai. Clojure resolve essa questões com estruturas de dados persistêntes. <a href="http://blog.higher-order.net/2010/08/16/assoc-and-clojures-persistenthashmap-part-ii/" target="_blank">Aqui</a> você encontra uma boa explicação sobre estas estruturas. Vamos a um exemplo: Pegue a lista numbers e faça um prepend do valor 5 nesta lista:</p>
<pre class="brush: clojure; title: ; notranslate">
(cons 5 numbers);; o REPL mostrará (5 0 1 2 3 4)
numbers;; e o REPL mostrará novamente (0 1 2 3 4)
</pre>
<p>Isso deixa claro como <em>numbers </em>não vai mudar. A menos que você use algum artifício da sua linguagem (clojure: <a href="http://clojure.org/atoms" target="_blank">atoms</a>, <a href="http://clojure.org/refs" target="_blank">refs</a>, <a href="http://clojure.org/vars" target="_blank">vars</a>, <a href="http://clojure.org/agents" target="_blank">agents</a> e <a href="http://www.infoq.com/interviews/hickey-clojure-protocols">pods brevemente</a>) para acesso aos valores de uma identidade ao longo do tempo. Ainda assim, o que vai mudar é o para onde no tempo a sua identidade aponta, mas os valores nunca irão mudar. Assim como seu passado não mudará. Profundo. Mas não fica proibido o uso de alguma variável completamente mutável.</p>
<h2>5. Recursividade não deve ser estranho</h2>
<p>Funções recursivas por incrível que parece ainda causam confusão na cabeça da grandíssima maioria dos programadores. <a href="http://citizen428.net/archives/1410">Este post</a> de Michael Kohl (<a href="http://twitter.com/citizen428">@citizen428</a>) fala especificamente de <a href="http://en.wikipedia.org/wiki/Fixed_point_combinator">Y Combinator</a> que é implementado com um conjunto de funções recursivas, lambdas e high-order functions ao mesmo tempo. Entender este post é obrigatório se você quer seu cérebro afiado.</p>
<h2>Além disso&#8230;</h2>
<p>Na verdade existem conceitos mais profundos no universo funcional. Coisas que sinceramente são capazes de torcer o cérebro de qualquer um. Existem também outras linguagens que não estas que mais estudo como <a href="http://www.erlang.org/">Erlang</a>, <a href="http://www.haskell.org/haskellwiki/Haskell">Haskell</a> (talvez a mais impressionante em termos conceituais e expressividade funcional), Scheme, Lisp, <a href="http://racket-lang.org/">Racket</a> (sensacional), e outras.</p>
<p>Programação funcional não é sobre moda, ou sobre &#8220;passar um método como argumento&#8221;, ou &#8220;sobre escrever um programa inteiro em uma linha só&#8221;. FP (Functional Programming) é sobre elaborar soluções focadas no problema, e de forma elegante e muito concisa. Ainda que não use no seu dia-a-dia, é de grande utilidade para suas próximas construções mesmo numa linguagem imperativa. <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>É isso e não esqueça de me seguir no twitter: <a href="twitter.com/paulosuzart">@paulosuzart</a>.</p>
<p>Ah, este post deveria ter 10 itens. Estou buscando os demais itens no exterior. Espero conseguí-los. Este post teve apoio de <a href="http://twitter.com/jneira">@jneira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2011/01/01/5-things-to-a-functional-brain/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
		<item>
		<title>Basic Authentication no GAE com Tornado</title>
		<link>https://codemountain.wordpress.com/2010/11/06/basich-authentication-no-gae-com-tornado/</link>
					<comments>https://codemountain.wordpress.com/2010/11/06/basich-authentication-no-gae-com-tornado/#comments</comments>
		
		<dc:creator><![CDATA[paulosuzart]]></dc:creator>
		<pubDate>Sat, 06 Nov 2010 14:12:08 +0000</pubDate>
				<category><![CDATA[python]]></category>
		<category><![CDATA[gae]]></category>
		<guid isPermaLink="false">http://codemountain.wordpress.com/?p=783</guid>

					<description><![CDATA[Olá! Pra quem já usou o Tornado, vai perceber que o framework permite autenticação via cookie criptografado. O exemplo original da documentação usa uma autenticação por formulário, o que é ótimo para visitantes que desejem utilizar as funcionalidades da nossa aplicação via página web, mas o que fazer para proteger uma API rest construída no [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá! Pra quem já usou o <a href="http://www.tornadoweb.org/" target="_blank">Tornado</a>, vai perceber que o framework permite autenticação via <a href="http://www.tornadoweb.org/documentation#user-authentication" target="_blank">cookie criptografado</a>. O exemplo original da documentação usa uma autenticação por formulário, o que é ótimo para visitantes que desejem utilizar as funcionalidades da nossa aplicação via página web, mas o que fazer para proteger uma API rest construída no GAE com o Tornado?</p>
<p>Uma possibilidade simples é o uso da autenticação no nível do transporte, o <a href="http://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank">HTTP Basic Authentication</a>, que não é lá estas coisas, mas tem seu lugar. Outro ponto importante é que na minha API, eu gostaria de usar um esquema de <a href="http://www.python.org/dev/peps/pep-0318/" target="_blank">Decorator em Python</a> (explicar o funcionamento dos decorators está fora do escopo deste post, mas o link anterior oferece bastante info) para facilitar a minha vida. Isto é, eu gostaria de usar algo semelhante a interceptors ou filters em Java. O uso deveria ficar mais ou menos assim:</p>
<pre class="brush: python; title: ; notranslate">
MyRequestHandler(tornado.web.RequestHandler):
	@authenticated(authenticator)
	def post(self, username):
		#alguma protegida aqui

def authenticator(user,pass):
	#Nossa logica de auth aqui, seja acessar o DataStore
        #ou qualquer coisa para verificar a autenticidade da informação
</pre>
<p><em>@authenticated</em> é uma função de decoração que receberá nosso autenticador como parâmetro, que por sua vez será utilizado dentro do código que irá iterceptar a invocação da função post em <em>MyRequestHandler</em>.</p>
<p>Agora a parte mais interessante, o nosso Decorator propriamente dito. Este cara precisa fazer o seguinte: verificar se o usuário tem um cookie criptografado, se não tiver, verificar os cabeçalhos http referentes a Basic Authentication, que por sua vez fornecerão usuário e senha para passarmos para a função <em>authenticator</em>. Naturalmente, se existe um cookie criptografado e válido, pulamos a validação do cabeçalho HTTP e permitimos a invocação do da função post do <em>MyRequestHandler</em>. Abaixo o código inteiro do Decorator e depois os comentários:</p>
<pre class="brush: python; title: ; notranslate">
def authenticated(auth):
	&quot;&quot;&quot;Decorate a function to request user authentication before processing.
		Just uses Basic HTTP Authentication.
	&quot;&quot;&quot;
	def decore(f):

		def _request_auth(handler):
			&quot;&quot;&quot;Responds 401 to the client, that may prompts the user for auth data.&quot;&quot;&quot;
			handler.set_header('WWW-Authenticate', 'Basic realm=tmr')
			handler.set_status(401)
			handler.finish()
			return False

		@functools.wraps(f)
		def new_f(*args):
			&quot;&quot;&quot;The actual wrapper of the function. Check if auth data is present, if so, invokes
				the auth (authenticated argument) for credential check, if ok, the wrapper function is invoked
				with an aditional argument, the username.&quot;&quot;&quot;
			handler = args[0]

			auth_header = handler.request.headers.get('Authorization')

			if (not handler.get_secure_cookie(&quot;user&quot;) and (auth_header is None or not auth_header.startswith('Basic '))):
				return _request_auth(handler)
			elif handler.get_secure_cookie(&quot;user&quot;):
				logging.info(&quot;####Login by cookie&quot;)
				user = handler.get_secure_cookie(&quot;user&quot;)
			else:
				logging.info(&quot;###First login by http&quot;)
				auth_decoded = base64.decodestring(auth_header[6:])
				user, password = auth_decoded.split(':', 2)
				if not auth(user, password):
					_request_auth(handler)
				handler.set_secure_cookie(&quot;user&quot;, user)
			f(username=user, *args)
			return

		return new_f
	return decore
</pre>
<p>O código poderia ter sido escrito de alguma outra fora, sei lá, organizar e encadear os ifs de outra maneira, enfim. Acho que aqui fica suficiente pra representar o que falei logo acima, que é a lógica de execução da coisa.</p>
<p>Veja que <em>authenticated</em> na verdade é uma função definida como outra qualquer. Ela recebe uma função que recebe dois argumentos (usuário e senha), que por sua vez retornará True ou False, indicando sucesso na autenticação. <em>authenticated</em> de fato retorna outra função, a função <em>decore</em>. <em>decore </em>é uma função qure retorna uma função decorada (a <em>new_f</em>) com <em>@functools.wraps</em>, que nada mais é permitir que <em>new_f</em> fique com a mesma &#8220;cara&#8221; que a nossa função <em>post </em>do <em>MyRequestHandler</em>. Estranho? Veja detalhes <a href="http://docs.python.org/library/functools.html" target="_blank">aqui</a>.</p>
<p>Pois bem, nossa <em>decore</em> recebe f como parâmetro, que na verdade é a função <em>post</em> do Request Handler e retorna <em>new_f</em>, que por sua vez recebe os mesmos parâmetros que <em>post</em> na forma de <em>*args</em>. <em>*args</em> é o jeito python de uma função receber um número de argumentos variável, dado que quando decoramos uma função, não sabemos exatamente quantos parâmetros aquela função receberá. Mais detalhes sobre <em>*args</em> e <em>**kwargs</em> <a href="http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/" target="_blank">aqui</a>.</p>
<p>Quem mantém a lógica de verificação da presença das credenciais (seja por cookie, seja por http) é <em>new_f</em>, que delega para <em>_request_auth</em> os casos onde a credencial não está presente e para <em>auth</em> os casos onde existem as credenciais http. <em>_request_auth</em> só envia um status code 401 para o client, para que este envie as informações do usuário e senha.</p>
<p>A execução de <em>post</em> fica no final de <em>new_f</em> onde ela invoca <em>f (username=user, *args). </em>Aqui podemos ver uma pseudo injeção de dependência, dado que username poderia ser um objeto do tipo user retornado da base ou qualquer outra coisa. Por que injeção? Por que o Tornado não conhece este parâmetro, quer ficaria nulo caso a função <em>post </em>não tivesse sido anotada com <em>@authenticated</em>.</p>
<p>O código aqui está em funcionamento em uma aplicação que estou fazendo. Mas não postei aqui a aplicação completa. Ao usar este decorator, meu log mostra (considerando usuário jordan e uma senha qualquer):</p>
<pre class="brush: bash; title: ; notranslate">
INFO     2010-11-06 13:30:27,448 utils.py:37] ###First login by http
INFO     2010-11-06 13:30:27,448 api.py:34] ########jordan######
INFO     2010-11-06 13:30:27,461 dev_appserver.py:3283] &quot;GET /api/track/twitter/mentions HTTP/1.1&quot; 200 -
INFO     2010-11-06 13:30:31,903 utils.py:34] ####Login by cookie
INFO     2010-11-06 13:30:31,904 api.py:34] ########jordan######
</pre>
<p>Meu autenticador passado para @authenticated, por enquanto é um lambda que retorna True para qualquer usuário e senha.</p>
<pre class="brush: python; title: ; notranslate">
@authenticated(lambda x,y: True)
def post(self, username): #...
</pre>
<p>Acho que é só. A intenção aqui é de orientação e mostrar alguns dos desafios que podemos enfrentar usando o Google App Engine (GAE) e o Tornado.<br />
Não mostro aqui os detalhes gerais de se usar o Tornado no GAE, mas é possível encontrar muito material bom na internet. Espero que tenham gostado e não esqueçam, follow me on twitter: <a href="http://twitter.com/paulosuzart" target="_blank">@paulosuzart</a></p>
<p><em><strong>Post UPDATE</strong>:</em> por algum motivo sobrenatural eu escrevi *Basich* e não Basic. Por isto a URL contem um erro que ficará para a posteridade. Mereço um #Fail!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codemountain.wordpress.com/2010/11/06/basich-authentication-no-gae-com-tornado/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://0.gravatar.com/avatar/fc39212046ba0d32dc7ca6ce62bb52d29a33e6975525a79d07ca5b74cf7166b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">paulosuzart</media:title>
		</media:content>
	</item>
	</channel>
</rss>
