Vamos deixar a web mais rápida!

Posted by Rique Costa on June 25th, 2009

O Google liberou uma série de artigos do tipo howto explicando como aumentar a velocidade do seu website.

Acredito que fizeram isso para tentar “ensinar” a grande quantidade de pessoas que se utilizam de suas APIS.

Talvez isso já esteja indomodando, já que deve gerar uma lentidão absurda nos serviços do google.

Pensando (acredito eu) o google resolveu montar uma página de boas práticas para a programação de sites.

São diversos artigos como:

  1. Dicas de CSS, usando várioas declarações no CSS;
  2. Como funciona a compactação gzip;
  3. HTTP Caching;
  4. Melhorando a performance do seu website com Page Speed;
  5. Dicas de performance no PHP;
  6. Otimizando gráficos web;
  7. e muitos outros...

Clique aqui e veja todos os artigos!

Além desses artigos eu ainda recomendo o as extensões para o firefox: FireBug e também o WebDeveloper.

Aproveite!

Acesse já o site e vamos deixar a web mais rápida!

Programação poliglota

Posted by Rique Costa on June 19th, 2009

Li ontem um artigo chamado Polyglote Programming do Neal Ford, autor do “The Productive Programmer” comentado pelo Erich aqui no TecBlog.

Esse artigo, publicado numa antologia de artigos de funcionários da ThoughtWorks, fala sobre a necessidade de saber programar em várias linguagens não só para saber usar a linguagem mais apropriada para cada sistema mas também, dentro de um único sistema, saber usar a linguagem mais apropriada para a tarefa a ser resolvida.

De uma certa forma, o desenvolvimento de sistemas web já é poliglota, pois precisamos saber SQL, javascript, XML, HTML e alguma linguagem (Ruby, PHP, Java, etc.) para unir tudo. Mas a idéia do Neal Ford é ir além e usar as plataformas poliglotas (JVM, C#) para desenvolver cada pedaço de código com a linguagem mais apropriada para o que aquele pedaço de código precisa resolver.

Um exemplo que ele cita é a leitura de arquivos, que pode ser bastante trabalhosa em Java:

package com.nealford.polyglot.linenumbers;

import java.io.*;
import static java.lang.System.*;

public class LineNumbers {
  public LineNumbers(String path) {
    File file = new File(path);
    LineNumberReader reader = null;
    try {
      reader = new LineNumberReader(new FileReader(file));
      while (reader.ready()) {
        out.println(reader.getLineNumber() + ":"
          + reader.readLine());
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        reader.close();
      } catch (IOException ignored) {
      }
    }
  }

  public static void main(String[] args) {
    new LineNumbers(args[0]);
  }
}

Mas que em Groovy, que roda em JVM, ficaria:

def number=0
new File (args[0]).eachLine { line ->
  number++
  println "$number: $line"
}

Outro exemplo é um pedaço de código tirado do projeto Apache Commons para determinar em Java quando um string é vazio:

public static boolean isBlank(String str) {
  int strLen;
  if (str == null || (strLen = str.length()) == 0) {
    return true;
  }
  for (int i = 0; i < strLen; i++) {
    if ((Character.isWhitespace(str.charAt(i)) == false)) {
      return false;
    }
  }
  return true;
}

Usando Jruby teríamos:

class String
  def blank?
    empty? || strip.empty?
  end
end

E os testes para comprovar que está tudo certo:

require "test/unit"
require "blankness"

class BlankTest < Test::Unit::TestCase
  def test_blank
    assert "".blank?
    assert " ".blank?
    assert nil.to_s.blank?
    assert ! "x".blank?
  end
end

Outra dica que ele dá é usar uma linguagem funcional (Haskell, Scala, F#) para resolver a dificuldade que linguagens imperativas como Java e C# tem em lidar com threading:

class SafeArray{
  private final Object[] _arr;
  private final int _begin;
  private final int _len;
  public SafeArray(Object[] arr, int len){
    _arr = arr;
    _begin = begin;
    _len = len;
  }

  public Object at(int i){
    if(i < 0 || i >= _len){
      throw new ArrayIndexOutOfBoundsException(i);
    }
    return _arr[_begin + i];
  }
  public int getLength(){
    return _len;
  }
}

A mesma funcionalidade em Jaskell, a implementação de Haskell para JVM:

newSafeArray arr begin len = {
  length = len;
  at i = if i < begin || i >= len then
    throw $ ArrayIndexOutOfBoundsException.new[i]
  else
    arr[begin + i];
}

E o último exemplo do artigo compara construção de testes com JMock, para testar a interação entre uma classe Order com uma classe Warehouse:

package com.nealford.conf.jmock.warehouse;

import org.jmock.Mock;
import org.jmock.MockObjectTestCase;

public class OrderInteractionTester extends MockObjectTestCase {
  private static String TALISKER = "Talisker" ;

  public void testFillingRemovesInventoryIfInStock() {
    //setup - data
    Order order = new OrderImpl(TALISKER, 50);
    Mock warehouseMock = new Mock(Warehouse.class);

    //setup - expectations
    warehouseMock.expects(once()).method("hasInventory" )
      .with(eq(TALISKER),eq(50))
      .will(returnValue(true));
    warehouseMock.expects(once()).method("remove" )
      .with(eq(TALISKER), eq(50))
      .after("hasInventory" );

    //exercise
    order.fill((Warehouse) warehouseMock.proxy());

    //verify
    warehouseMock.verify();
    assertTrue(order.isFilled());
  }
}

E com JRuby:

require 'test/unit'
require 'rubygems'
require 'mocha'

require "java"
require "Warehouse.jar"
%w(OrderImpl Order Warehouse WarehouseImpl).each { |f|
  include_class "com.nealford.conf.jmock.warehouse.#{f}"
}

class OrderInteractionTest < Test::Unit::TestCase
  TALISKER = "Talisker"

  def test_filling_removes_inventory_if_in_stock
    order = OrderImpl.new(TALISKER, 50)
    warehouse = Warehouse.new
    warehouse.stubs(:hasInventory).with(TALISKER, 50).returns(true)
    warehouse.stubs(:remove).with(TALISKER, 50)
    order.fill(warehouse)
    assert order.is_filled
  end
end

Para terminar esse post, aqui vai um link para um vídeo do Neal Ford explicando o conceito de programação poliglota:

http://www.nofluffjuststuff.com/media.jsp?id=28

*Post retirado do blog Tecnologia da Internet da locaweb

Vem aí o Firefox 3.5

Posted by Rique Costa on June 10th, 2009

Rediscover the web

Fique ligado no lançamento…

Erro no SQL Server Management 2008 ao acessar base do SQL Server 2000

Posted by Rique Costa on June 9th, 2009

Já algum tempo que eu estava tendo esse problema, ao acessar uma base do SQL Server 2000 com o SQL Server Management 2008 dava este problema:

Falha ao recuperar dados para essa solicitação. (Microsoft.SqlServer.Management.Sdk.Sfc)
Server user ‘xyz’ is not a valid user in database ‘e-Pocurement_A’. (Microsoft SQL Server, Erro: 916)

Ocorreu uma exceção ao executar um lote ou uma instrução Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)

The server principal “xz” is not able to access the database “kk” under the current security context. (.Net SqlClient Data Provider)

A Microsoft confirma o erro para outros produtos além do SQL Server Management 2008 listados abaixo

Outros softwares afetados:

  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
  • Microsoft SQL Server 2008 Reporting Services

PS: Este problema também pode acontecer se não for um usuário do grupo Sysadmins.

Para solucionar o problema:

  1. Para contornar este problema, siga estes passos:
  2. Feche a mensagem de erro.
  3. Pressione F7 para abrir o painel de detalhes do Explorador do objeto .
  4. Clique os cabeçalhos da coluna com o botão direito do mouse e desmarque a coluna Agrupamento.
  5. Clique com o botão direito do mouse no nó de bases de dados e, em seguida, clique em Atualizar .

Agora tudo deverá voltar ao normal ;)

Como serão os aplicativos de escritório em 2019?

Posted by Rique Costa on June 2nd, 2009

Vídeo criado pela Divisão de Negócios da Microsoft para a Wharton Business Technology Conference mostra como será usar aplicativos de escritório daqui 10 anos.

Uma pergunta, não vai ter teclado nem mouse? Eu não vi…


Copyright © 2007 AFL Sistemas. All rights reserved.