<?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/"
	>

<channel>
	<title>William Ferreira</title>
	<atom:link href="http://williamferreira.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://williamferreira.net/blog</link>
	<description>Só mais um site WordPress</description>
	<lastBuildDate>Fri, 07 Oct 2011 16:13:33 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Python: Passagem de parâmetros Flexível</title>
		<link>http://williamferreira.net/blog/2011/10/07/python-passagem-de-parametros-flexivel/</link>
		<comments>http://williamferreira.net/blog/2011/10/07/python-passagem-de-parametros-flexivel/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 16:13:33 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[parametros]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=307</guid>
		<description><![CDATA[Uma coisa que me chamou atenção e inicialmente me agradou quando eu aprendi java foi quantidade de métodos com sobrecarga. Eu podia invocar o mesmo método passando quantidade ou tipo de parâmetros diferentes dependendo da ocasião. Exemplo: ao tentar usar System.out.printf teria a possibilidade de usar: public PrintStream printf(String format, Object... args) ou public PrintStream [...]]]></description>
			<content:encoded><![CDATA[<p>Uma coisa que me chamou atenção e inicialmente me agradou quando eu aprendi java foi quantidade de métodos com sobrecarga. Eu podia invocar o mesmo método passando quantidade ou tipo de parâmetros diferentes dependendo da ocasião.</p>
<p>Exemplo: ao tentar usar <code>System.out.printf</code> teria a possibilidade de usar:</p>
<pre class="brush: java; ">

public PrintStream printf(String format,
                          Object... args)

</pre>
<p>ou</p>
<pre class="brush: java; ">

public PrintStream printf(Locale l,
                          String format,
                          Object... args)

</pre>
<p>Em Python isso muda um pouco pois como declarar um método com a mesma quantidade de parâmetros e tipos de dados diferente em uma linguagem de tipagem dinâmica? Essa pergunta me perturbou um tempinho até que descobri como isso funciona: Os métodos são declarado normalmente e o tipo de dados enviado é verificado dentro do método e assim toma-se a decisão do que fazer.</p>
<p>Isso é no meu ponto de vista até inteligente pois a inplemententção do método em questão fica muito mais flexível. </p>
<p>Agora, o que é mais interessante mesmo é a chamada de um método com valores padrão (o mesmo que acontece quando você tinha métodos com 3, 4 ou 5 parâmetros em outras linguagens, sendo que um chamava o outro adicionando o parâmetro que faltava).</p>
<p>Em um exemplo simples teríamos:</p>
<pre class="brush: python; ">

class Ponto(object):
    def __init__(self, x=0, y=0, z=0):
        self.x = x
        self.y = y
        self.z = z

    def __str__(self):
        return &#039;&lt;Ponto x: {0} y: {1} z: {2}&gt;&#039;.format(
        self.x, self.y, self.z)

</pre>
<p>Pode-se notar na declaração do metodo &#8220;__init__&#8221; que &#8220;x&#8221;, &#8220;y&#8221; e &#8220;z&#8221; são definidos com valor 0 (zero), isso significa que na ausência desses valores na chamada o mesmo assumirá esse valor (zero). A grande sacada do Guido ao fazer isso é que é possível por exemplo passagem o ultimo parâmetro apenas e suprimir os demais.</p>
<p>Veja no exemplo:</p>
<pre class="brush: python; ">

p1 = Ponto(2, 3, 4) # x=2, y=3 e z=4
p2 = Ponto(3, z=4)  # x=3, y=0 e z=4
p3 = Ponto(z=4)     # z=4 e os demais são 0

</pre>
<p>Obs.: A <a href="http://www.python.org/dev/peps/pep-0008/">PEP-8</a> define que por padrão a passagem de parametros com nome deve feita sem espaços entre o nome e o sinal de igualdade (&#8220;=&#8221;) ou o sinal e o valor.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/10/07/python-passagem-de-parametros-flexivel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bem vindo a mias um blog com Nginx</title>
		<link>http://williamferreira.net/blog/2011/10/07/bem-vindo-a-mias-um-blog-com-nginx/</link>
		<comments>http://williamferreira.net/blog/2011/10/07/bem-vindo-a-mias-um-blog-com-nginx/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 15:45:16 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=301</guid>
		<description><![CDATA[Hoje realizei algo que estava nos meus planos a um bom tempo: migrei o site para Nginx e dei adeus definitivamente ao Apache. Não que tenha algo contra o Apache mais não é nenhuma novidade que o Nginx tem uma performance muito melhor, (principalmente quando se trata de entregar arquivos estáticos). A união disso com [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje realizei algo que estava nos meus planos a um bom tempo: migrei o site para <a href="http://www.nginx.net/">Nginx</a> e dei adeus definitivamente ao Apache. </p>
<p>Não que tenha algo contra o Apache mais não é nenhuma novidade que o Nginx tem uma performance muito melhor, (principalmente quando se trata de entregar arquivos estáticos).</p>
<p>A união disso com o php rodando sobre FastCGI se mostrou algo que eu não esperava: ganho de 20% do tempo de carregamento em comparação do apache usando cache e do nginx ainda sem cache.</p>
<p>Bom pessoal, espero que a mudança agrade à todos. Bom final de semana.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/10/07/bem-vindo-a-mias-um-blog-com-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Controle de Cache &#8211; Apache</title>
		<link>http://williamferreira.net/blog/2011/10/04/controle-de-cache-apache/</link>
		<comments>http://williamferreira.net/blog/2011/10/04/controle-de-cache-apache/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 15:50:45 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cache]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=291</guid>
		<description><![CDATA[Há várias maneiras de controlar o caché devido a sua importância. Irei mostrar nos próximos dias algumas delas. Por hora vou me ater simplesmente a um exemplo nada complexo onde você pode &#8220;cachear&#8221; conteúdo sem impacto no código. Vamos ao exemplo, adiciona o conteudo ao arquivo .htaccess do seu site. &#60;FilesMatch &#34;.(ico&#124;pdf&#124;flv&#124;jpg&#124;jpeg&#124;png&#124;gif&#124;js&#124;css&#124;swf)$&#34;&#62; Header set Cache-Control [...]]]></description>
			<content:encoded><![CDATA[<p>Há várias maneiras de controlar o caché devido a sua importância. Irei mostrar nos próximos dias algumas delas. Por hora vou me ater simplesmente a um exemplo nada complexo onde você pode &#8220;cachear&#8221; conteúdo sem impacto no código.</p>
<p>Vamos ao exemplo, adiciona o conteudo ao arquivo .htaccess do seu site.</p>
<pre class="brush: plain; ">

&lt;FilesMatch &quot;.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$&quot;&gt;
Header set Cache-Control &quot;max-age=604800, public&quot;
&lt;/FilesMatch&gt;

</pre>
<p>O código é simples mais, explicando rapidamente temos a primeira linha onde é feito filtro dos arquivos através de uma expressão regular (<a href="http://www.williamferreira.net/blog/2011/06/01/expressoes-regulares/" title="Expressões regulares">veja</a>). Nessa expressão todos arquivos de icones, pdf, video do flash, imagens de modo geral, javascript, folha de estilo, e filmes do flash serão armazenados no cache do apache. </p>
<p>O período do cache é definido através da segunda linha onde o &#8220;Cache-Control&#8221; (parte do header da resposta) é reescrito para &#8220;max-age&#8221; (tempo de cache) igual a 604800. Esse valor representa a quantidade de segundos existentes em uma semana (60s * 60 * 24 * 7 = 604800).</p>
<p>Com isso você ganhará em tempo de carga do seu site e consequentemente até o Google gostará mais dele. Aguarde pois mostrarei outras formas de obter o mesmo comportamento o mais rápido possível. Até breve.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/10/04/controle-de-cache-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Botões do Facebook e Twitter</title>
		<link>http://williamferreira.net/blog/2011/09/27/botoes-do-facebook-e-twitter/</link>
		<comments>http://williamferreira.net/blog/2011/09/27/botoes-do-facebook-e-twitter/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 12:39:04 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=244</guid>
		<description><![CDATA[Com o advento das redes sociais &#8220;todos&#8221; sites tentam usa-las para promover seu conteúdo. Essa tarefa se torna ainda mais fácil através dos botões disponibilizados por essa redes. Por isso resolvi criar esse post para mostrar como e simples trabalhar com eles. Para Facebook basta adicionar o seguinte código. &#60;div id=&#34;fb-root&#34;&#62;&#60;/div&#62; &#60;script&#62;(function(d, s, id) { [...]]]></description>
			<content:encoded><![CDATA[<p>Com o advento das redes sociais &#8220;todos&#8221; sites tentam usa-las para promover seu conteúdo. Essa tarefa se torna ainda mais fácil através dos botões disponibilizados por essa redes. Por isso resolvi criar esse post para mostrar como e simples trabalhar com eles.</p>
<p>Para Facebook basta adicionar o seguinte código.</p>
<pre class="brush: html; ">


&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
&lt;script&gt;(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = &quot;//connect.facebook.net/pt_BR/all.js#xfbml=1&quot;;
  fjs.parentNode.insertBefore(js, fjs);
}(document, &#039;script&#039;, &#039;facebook-jssdk&#039;));&lt;/script&gt;

&lt;div class=&quot;fb-like&quot; data-href=&quot;www.meusite.com&quot; data-send=&quot;false&quot; data-layout=&quot;button_count&quot; data-show-faces=&quot;false&quot;&gt;&lt;/div&gt;

</pre>
<p>O link que será registrado pelo Facebook será o valor informa no atributo &#8220;data-href&#8221; da ultima div.</p>
<p>Na verdade o Facebook disponibiliza um <a href="https://developers.facebook.com/docs/reference/plugins/like/">editor</a> para definir esse botão da forma que melhor atende-lo. A unica coisa que merece um pouco de atenção é que o código gerado referencia um arquivo em &#8220;//connect.facebook.net/en_US/all.js&#8221;. Esse código precisa ser alterado para o nosso idioma modificando &#8220;en_US&#8221; para &#8220;pt_BR&#8221;.</p>
<p>Alem disso caso esteja testando em um arquivo local fora de qualquer servidor http, acrescente &#8220;http:&#8221; antes do nome do arquivo pois caso contrario o mesmo será procurado na maquina local (&#8220;file://&#8221;) e não será encontrado.</p>
<p>Para o Twitter teremos:</p>
<pre class="brush: html; ">

&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-count=&quot;none&quot; rel=&quot;nofollow&quot;&gt;Tweet&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;

</pre>
<p>Nesse exemplo a url utilizada é a da própria pagina, sendo que outra url pode ser informada no atributo &#8220;data-url&#8221; do link (tag &#8220;a&#8221;). Para mais parametros verifique a documentação oficial no <a href="https://dev.twitter.com/docs/tweet-button">site</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/09/27/botoes-do-facebook-e-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi: Criando uma lista associada simples</title>
		<link>http://williamferreira.net/blog/2011/09/26/delphi-criando-uma-lista-associada-simples/</link>
		<comments>http://williamferreira.net/blog/2011/09/26/delphi-criando-uma-lista-associada-simples/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 02:33:30 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[delphi]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=173</guid>
		<description><![CDATA[Já abordei em outro tópico a utilização de vetores no Delphi. O vetores do Delphi são ótimos porem seria ótimo se nativamente permitissem acessar um item através de uma string, conforme o exemplo: procedure Teste; var vetor : array of integer; begin vetor[&#039;valor1&#039;] = 2; end; Infelizmente isso não é possível, porem poder implementar tal [...]]]></description>
			<content:encoded><![CDATA[<p>Já abordei em outro <a href="http://www.williamferreira.net/blog/?p=101">tópico</a> a utilização de vetores no Delphi. O vetores do Delphi são ótimos porem seria ótimo se nativamente permitissem acessar um item através de uma string, conforme o exemplo:</p>
<pre class="brush: delphi; ">

procedure Teste;
var
  vetor : array of integer;
begin
  vetor[&#039;valor1&#039;] = 2;
end;

</pre>
<p>Infelizmente isso não é possível, porem poder implementar tal recurso.</p>
<p>Inicialmente idealizei um classe para executar essa tarefa da seguinte forma:</p>
<pre class="brush: delphi; ">

type
  TVarArray = class
  private
    FKeys : array of Variant;
    FValues : array of Variant;
    FSize : integer;
    FDefaultValue: Variant;
    function GetValue(Index: Variant): Variant;
    procedure SetValue(Index: Variant; const Value: Variant);
    procedure SetSize(ASize : integer);
  public
    property Size : integer read FSize;
    procedure Clear;
    constructor Create;
    function ValueFromIndex(Index: integer): variant;
    function KeyFromIndex(Index: Integer): Variant;
    function IndexOf(Value : Variant): integer;
    property DefaultValue: Variant read FDefaultValue write FDefaultValue;
    property Values[Key : Variant]: Variant read GetValue write SetValue; default;
  end;

</pre>
<p>Após implementada essa classe me permitirá (alem da funcionalidade já mensionada) verificar seu tamanho(Size), limpa-la(Clear), percorrer as chaves (KeyFromIndex) e valores (ValueFromIndex) e verificar a existência de um valor (IndexOf). Então vamos ao código detalhado e explicado:</p>
<pre class="brush: delphi; ">

procedure TVarArray.SetSize(ASize: integer);
begin
  FSize := ASize;
  SetLength(FKeys, ASize);
  SetLength(FValues, ASize);
end;

procedure TVarArray.Clear;
begin
  SetSize(0);
end;

</pre>
<p>Aqui temos a função responsável por limpar nossa lista, definindo seu tamanho para 0 (zero). A função SetSize recebe o tamanho e redimensiona o vetor com as chaves e com os valores, essa mesma função sera usada na inserção de valores mais a frente.</p>
<pre class="brush: delphi; ">

function TVarArray.IndexOf(Value: Variant): integer;
var
  i : integer;
begin
  for i := Length(FKeys) - 1 downto 0 do
    if FKeys[i] = Value then
      Break;
  Result := i;
end;

</pre>
<p>Aqui temos a função que retorna a posição de uma chave na lista, ou -1 caso não seja encontrada.</p>
<pre class="brush: delphi; ">

function TVarArray.ValueFromIndex(Index: integer): variant;
begin
  if Index &gt;= FSize then
    Result := FDefaultValue
  else
    Result := FValues[Index];
end;

function TVarArray.KeyFromIndex(Index: Integer): Variant;
begin
  if (Index &gt;= FSize) or (Index &lt; 0) then
    Result := FDefaultValue
  else
    Result := FKeys[Index];
end;

</pre>
<p>Parecido com a anterior porem retornando valores em função do índice recebido as funções ValueFromIndex e KeyFromIndex retorna o valor e a chave de cada índice da lista respectivamente.</p>
<pre class="brush: delphi; ">

function TVarArray.GetValue(Index: Variant): Variant;
var
  idx : Integer;
begin
  idx := IndexOf(Index);
  if idx = -1 then
    Result := FDefaultValue
  else
    Result := FValues[idx];
end;

</pre>
<p>Enfim a chegamos a parte que retorna cada valor da propriedade Values, nessa parte uma chave é procurada na lista (IndexOf) caso encontradas o valor de mesmo indice na lista de valores é retornado, caso contrario o valor padrão (DefaltValue) será retornado.</p>
<pre class="brush: delphi; ">

procedure TVarArray.SetValue(Index: Variant; const Value: Variant);
var
  idx : integer;
begin
  idx := IndexOf(Index);
  if idx = -1 then
  begin
    idx := Length(FKeys);
    SetSize(idx + 1);
    FKeys[idx] := Index;
  end;
  FValues[idx] := Value;
end;

</pre>
<p>O SetValue é quem comanda a inserção de um item na lista caso o mesmo não seja encontrado. Depois disso o valor é coloca na lista (Seja no novo item ou no encontrado).</p>
<pre class="brush: delphi; ">

constructor TVarArray.Create;
begin
  inherited;
  FDefaultValue := Null;
  SetSize(0);
end;

</pre>
<p>Por fim mais não menos importante tempo o construtor da classe que define o valor padrão para Null e o tamanho inicial da lista para 0 (zero).</p>
<p>O código fonte completo pode ser encontrado <a href="http://www.williamferreira.net/uploads/VarArray.pas">aqui</a>. Todo o trabalho desenvolvido aqui pode ser feito através de um dicionário. Porem para as versões mais antigas no Delphi onde esse recurso não está disponível, e também para fins didáticos essa continua sendo uma implementação útil.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/09/26/delphi-criando-uma-lista-associada-simples/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiplas configurações no Google Chrome</title>
		<link>http://williamferreira.net/blog/2011/09/26/multiplas-configuracoes-no-google-chrome/</link>
		<comments>http://williamferreira.net/blog/2011/09/26/multiplas-configuracoes-no-google-chrome/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 01:55:16 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[favoritos]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=247</guid>
		<description><![CDATA[Depois de alguns meses sem tempo pra postar algo aqui volto pra compartilhar um recurso de um dos programas que mais utilizo: o Goole Chrome. Sempre tive problemas (e muita gente ainda tem) com os favoritos do navegador. Este recurso que se bem utilizado pode nos ajudar muito ja me deixou contrariado quando adicionei um [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de alguns meses sem tempo pra postar algo aqui volto pra compartilhar um recurso de um dos programas que mais utilizo: o Goole Chrome.</p>
<p>Sempre tive problemas (e muita gente ainda tem) com os favoritos do navegador. Este recurso que se bem utilizado pode nos ajudar muito ja me deixou contrariado quando adicionei um item no computador pessoal e quando precisei do mesmo em outro computador não foi possível e nem mesmo sabia onde encontra-lo novamente.</p>
<p>Com a vinda do Google Crome esse problema foi resolvido pois o mesmo possui uma opção de sincronizar os favoritos, senhas, preferências, aplicativos e extensões com a conta do gmail. Assim em qualquer maquina que eu vá terei tudo da forma que estava na outra maquina.</p>
<p>Porem o tópico é sobre como configurar o Crome para aceitar mais de uma configuração dessas.</p>
<p>Então vamos lá, Crie um atalho para:</p>
<pre class="brush: javascript; ">

&quot;C:Documents and SettingsUsuarioConfigurações locaisDados de aplicativosGoogleChromeApplicationchrome.exe&quot; --user-data-dir=D:Dados-Chrome

</pre>
<p>Este atalho tem como parâmetro os caminho onde serão salvos todos dados da instancia no navegador que será iniciado. Com isso é possivel com apenas uma instalação usa-lo com configurações completamente distintas.</p>
<p>Nessa época onde a segurança tem sido lavada muito a serio e até mesmo temos lido sobre <a href="http://g1.globo.com/tecnologia/noticia/2011/08/entenda-por-que-desativar-o-plugin-do-java-ajuda-seguranca.html">desativar o plugin do java</a>, esse resurso vem a calhar pois podemos ter o navegado com o(s) plugin(s) desativado(s) e outro com tudo ativado para situações especiais.</p>
<p>Por agora e só pessoal.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/09/26/multiplas-configuracoes-no-google-chrome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Expressões regulares</title>
		<link>http://williamferreira.net/blog/2011/06/01/expressoes-regulares/</link>
		<comments>http://williamferreira.net/blog/2011/06/01/expressoes-regulares/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 12:59:06 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[Livros]]></category>
		<category><![CDATA[er]]></category>
		<category><![CDATA[expressões regulares]]></category>
		<category><![CDATA[livro]]></category>
		<category><![CDATA[piazinho]]></category>

		<guid isPermaLink="false">http://williamferreira.net/blog/?p=17</guid>
		<description><![CDATA[Já citei em um post anterior o piazinho, isso porque é um livro onde o autor (Aurélio Marinho) trata de forma divertida um assunto complexo que é o universo das expressões regulares. Eu mesmo por um bom tempo ignorei-as mais depois que tomei coragem para estudar mais o assunto (ainda sou leigo mais me viro) [...]]]></description>
			<content:encoded><![CDATA[<p>Já citei em um post anterior o <a href="http://www.piazinho.com.br">piazinho</a>, isso porque é um livro onde o autor (Aurélio Marinho) trata de forma divertida um assunto complexo que é o universo das expressões regulares.</p>
<p>Eu mesmo por um bom tempo ignorei-as mais depois que tomei coragem para estudar mais o assunto (ainda sou leigo mais me viro) percebi o quando elas podem ajudar um programador no seu dia-a-dia, mesmo que não seja no desenvolvimento. Para quem não sabe (assim como eu não sabia) elas poder ser empregadas no Microsoft Word, Open Office, Notapad++, assim como vários outros.</p>
<p>Não vou entrar em detalhes aqui e tentar explicar o funcionamento de uma daquelas &#8220;letrinhas&#8221;, mas fica aí a dica de leitura, para quem quiser investir um tempinho em aumentar seus conhecimentos.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/06/01/expressoes-regulares/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript: URL invertida</title>
		<link>http://williamferreira.net/blog/2011/05/31/javascript-url-invertida/</link>
		<comments>http://williamferreira.net/blog/2011/05/31/javascript-url-invertida/#comments</comments>
		<pubDate>Tue, 31 May 2011 13:56:36 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[reverse]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=220</guid>
		<description><![CDATA[Uma dica rápida hoje: estava pensado como resolver de forma simples um problema que tenho com pouca freqüência porem é muito chato: Quando vou fazer o download de um arquivo sou primeiramente redirecionado para um site de publicidade e só depois de um tempo (ou cadastro) posso prosseguir com o download. Normalmente nessas situações pode [...]]]></description>
			<content:encoded><![CDATA[<p>Uma dica rápida hoje: estava pensado como resolver de forma simples um problema que tenho com pouca freqüência porem é muito chato: Quando vou fazer o download de um arquivo sou primeiramente redirecionado para um site de publicidade e só depois de um tempo (ou cadastro) posso prosseguir com o download. Normalmente nessas situações pode observar que a URL real do download é passada invertida como parâmetro. </p>
<p>Ex.: http://www.sitepropaganda.com.br?url=rb.moc.daolnwoduem.www//:ptth</p>
<p>Observe que &#8220;rb.moc.daolnwoduem.www//:ptth&#8221; corresponde justamente a &#8220;http://www.meudownload.com.br&#8221;. Para resolver esse problema apenas adicionei uma linha javascript nos meus favoritos, assim quando entro nesses sites simplesmente clico nesse meu item dos favoritos e sou redirecionado para o link correto. Veja:</p>
<pre class="brush: javascript; ">

javascript:location.href = (function() {
    var url = location.href.split(&#039;=&#039;);
    return url[url.length-1].split(&#039;&#039;).reverse().join(&#039;&#039;);
})()

</pre>
<p>Esse código simplesmente pega a url atual (location.href), &#8220;quebra&#8221; em um vetor usando pra isso o metodo split com um expressão regular simples (qualquer duvida leia o <a href="http://www.piazinho.com.br/">livro</a> do &#8220;cara&#8221;). O método reverse do Array do javascript faz efetivamente a inversão dos caracteres. E por fim o join junta tudo em uma nova string que é para onde serei redirecionado.</p>
<p>Bom pessoal era só isso, espero que ajude.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/05/31/javascript-url-invertida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript: Valor padrão em parâmetros/atributos</title>
		<link>http://williamferreira.net/blog/2011/05/06/javascript-valor-padrao-em-parametrosatributos/</link>
		<comments>http://williamferreira.net/blog/2011/05/06/javascript-valor-padrao-em-parametrosatributos/#comments</comments>
		<pubDate>Fri, 06 May 2011 18:09:33 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[parametros]]></category>
		<category><![CDATA[valor padrão]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=206</guid>
		<description><![CDATA[Uma dica rápida: estava com um problema recentemente onde ao criar um classe que recebia um objeto contendo varios atributos (parâmetros) eu não tinha certeza que um determinado parâmetro havia sido enviado, o que me obrigava a fazer algumas verificações. Veja o exemplo Classe = function (conf) { this.init = function() { // A verificação [...]]]></description>
			<content:encoded><![CDATA[<p>Uma dica rápida: estava com um problema recentemente onde ao criar um classe que recebia um objeto contendo varios atributos (parâmetros) eu não tinha certeza que um determinado parâmetro havia sido enviado, o que me obrigava a fazer algumas verificações. Veja o exemplo</p>
<pre class="brush: javascript; ">

Classe = function (conf) {

	this.init = function() {
		// A verificação pode ser feita assim
		if (typeof conf.a == &#039;undefined&#039;) {
			conf.a = 0;
		}
		if (!conf.b) { // ou assim
			conf.b = 0;
		}
		alert(conf.a + conf.b);
	}
}
var c = new Classe({a: 2});
c.init();

</pre>
<p>Esse é uma solução chata pois deve-se verificar cada atributo do object <code>conf</code>, alem de feio ainda dá problema se passo nulo no objeto.<br />
Uma alternativa bem mais elegante e pratica por ser:</p>
<pre class="brush: javascript; ">

Classe = function (conf) {

	this.init = function() {
		conf = conf || {};
		conf = {
			a: conf.a || 0,
			b: conf.b || 0,
		};
		alert(conf.a + conf.b);
	}
}
var c = new Classe({a: 2});
c.init();

</pre>
<p>Nesse problema sitado anteriormente (objeto nulo passado como parâmetro) é resolvido através da linha 4, Da linha 5 em diante o valor do objeto é atribuído novamente fazendo uma comparação com o valor padrão através do OU (||), ou seja: quando um atribuito não for definido o mesmo receberá o valor padrão.</p>
<p>Por hora e isso. Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/05/06/javascript-valor-padrao-em-parametrosatributos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: Criando uma classe iterável</title>
		<link>http://williamferreira.net/blog/2011/04/05/criando-uma-classe-iteravel/</link>
		<comments>http://williamferreira.net/blog/2011/04/05/criando-uma-classe-iteravel/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 19:22:21 +0000</pubDate>
		<dc:creator>william</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[iteração]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[yield]]></category>

		<guid isPermaLink="false">http://www.williamferreira.net/blog/?p=182</guid>
		<description><![CDATA[Depois de um tempinho sem postar nada aqui no blog, queria compartilhar o que estudado a respeito da linguagem Python. Por mais que minha caminha ainda esteja nos primeiros passos, a cada dia fico mais envolvido com o pode dessa linguagem. Essa semana queria fazer uma classe &#8220;iteravel&#8221;, ou seja eu queria favor com que [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de um tempinho sem postar nada aqui no blog, queria compartilhar o que estudado a respeito da linguagem Python. Por mais que minha caminha ainda esteja nos primeiros passos, a cada dia fico mais envolvido com o pode dessa linguagem.</p>
<p>Essa semana queria fazer uma classe &#8220;iteravel&#8221;, ou seja eu queria favor com que o comando &#8220;for&#8221; passasse por ela me retornado o nome do membros (métodos e variáveis), assim com se faz com &#8220;xrange()&#8221;.</p>
<p>Tamanha for a minha surpresa quando depois analisar opções malucas encontrei a solução:</p>
<pre class="brush: python; ">

class ClasseTeste(object):
    valor1 = 1
    valor2 = 2

    def ola(self):
        print &quot;Ola&quot;

    def __iter__(self):
        for attr in dir(self):
            if not attr.startswith(&#039;__&#039;):
                yield attr


if __name__ == &#039;__main__&#039;:
    c = ClasseTeste();
    for i in c:
        print i

</pre>
<p>e nesse caso obtive a sequinte saída:</p>
<pre>
ola
valor1
valor2
</pre>
<p>Esse resultado só foi possível graças a duas coisas: O método &#8220;__iter__&#8221; que é chamado sempre que acontece uma iteração com o objeto daquela classe.</p>
<p>E por fim temos o comando &#8220;yield&#8221; que é utilizado justamente para criação de <i>generators</i> ou seja, quando alcançado ele retorna o valor da variável &#8220;attr&#8221; para quem o chamou e armazena esse valor para que próxima chamada o valor permaneça como estava anteriormente, sendo possível assim que o &#8220;for&#8221; continue de onde parou.</p>
<p>Por hora é só mais pretendo continuar postado os resultado dos meus estudo sobre esta linguagem. Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://williamferreira.net/blog/2011/04/05/criando-uma-classe-iteravel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
