Categoria: Desenvolvimento


Tentando alterar a variável de ambiente APPLICATION_ENV para development numa aplicação do ZF como por exemplo:

SetEnv APPLICATION_ENV development
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

O ambiente não é alterado para modo de desenvolvimento. Isso pode ocorrer porque as configurações do Apache não estão permitindo.

Nesse caso, verifique se existe a diretiva AllowOverride All na configuração do virtual host do Apache (httpd-vhosts.conf).

Por exemplo:

<VirtualHost *:80>
ServerAdmin webmaster@testes.localhost
DocumentRoot "C:/Projetos/Testes/public"
ServerName testes.localhost
ErrorLog "logs/testes.localhost-error.log"
CustomLog "logs/testes.localhost-access.log" common
<Directory "C:/Projetos/Testes/public">
Allow from all
AllowOverride All
</Directory>
</VirtualHost>

No Zend Framework, se ocorreu o erro:

Zend_Db_Table_Row_Exception: Cannot refresh row as parent is missing in

ao sobrescrever o método insert numa classe Zend_Db_Table_Abstract, verifique se ele é finalizado corretamente, ou seja, ele retorna o resultado de execução da classe pai:

public function insert(array $data)
{
// seu código
return parent::insert($data);
}

Um script PHP pode estar funcionando normalmente na máquina de testes local mas ao subir para o provedor ele passa a exibir um erro como:

Parse error: syntax error, unexpected $end

Mas o que pode ter acontecido ? O script está funcionando normalmente no micro de desenvolvimento !

Experimente configurar seu cliente FTP para transferir arquivos com extensão PHP utilizando o modo de transferência binário.

Por exemplo, no caso do cliente Filezilla, entre no menu Editar/Configurações e na barra de opções do lado esquerdo, selecione Transferências/Tipos de Arquivo.

Lá existe uma lista de extensões que são tratadas em modo de transferência ASCII.

Selecione o tipo de arquivo PHP e clique em “Remover” como mostra a imagem abaixo.

Filezilla tipo de arquivo modo de transferência

Modo de transferência para arquivos do tipo PHP

As vezes temos um servidor dedicado Windows e precisamos fazer o PHP enviar e-mail através de um servidor SMTP autenticado.

A alternativa é utilizar uma classe não nativa do PHP (que suporte autenticação SMTP) ou utilizar este software que emula o “sendmail -t” do Unix.

Assim o mesmo código PHP que envia e-mail com autenticação SMTP funcionaria sem alteração em um servidor Linux ou Windows.

O software está em:

http://glob.com.au/sendmail/

No php.ini alteramos as linhas (exemplo no meu caso):

sendmail_path = "D:\Bibliotecas\sendmail\sendmail.exe -t"

E no arquivo sendmail.ini colocamos:

smtp_server=(servidor SMTP)
smtp_port=(porta)
default_domain=(domínio padrão)

Se o XDebug não funciona e não aparece no phpinfo talvez você tenha o mesmo problema que tive.

No site do PHP (http://windows.php.net/download/) há uma instrução do lado esquerdo dizendo que devemos utilizar o PHP compilado com Visual Studio 6 (VC6). Neste caso certifique-se de ter instalado esta versão e NÃO a versão compilada com Visual Studio 9 (VC9).

Baixe o XDebug apropriado para a sua versão do PHP para VC6, no meu caso é: php_xdebug-2.1.0-5.3-vc6.dll

No php.ini a linha deve ser algo como:

zend_extension = "C:\Program Files (x86)\PHP\ext\php_xdebug-2.1.0-5.3-vc6.dll"

Reinicie o servidor Apache e ao carregar um script com a função phpinfo() será exibido que o XDebug está ativo:

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

As vezes ao importar um arquivo de comandos SQL:

mysql -u root -p banco < banco_20101029.sql

Recebemos a mensagem:

ERROR 2006 (HY000) at line 19351: MySQL server has gone away

Isso pode ocorrer devido a limitação de tamanho default configurada para os pacotes transmitidos entre cliente e servidor. Estes valores atualmente são 16 MB para o cliente e 1 MB para o servidor no MySQL 5.1.

Para aumentar este valor, edite o my.cnf oy my.ini (Windows) alterando (ou adicionando) sob a seção [mysqld]:

[mysqld]
max_allowed_packet=16M

Depois reinicie o servidor MySQL.

Para confirmar o valor atual desta variável, execute dentro do servidor MySQL o comando:

show variables like '%packet%';

E o resultado deverá ser:

+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)

Mais informações:

http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

Esta função em Javascript testa uma data para verificar se é válida.

Se você tem alguma outra sugestão para esta função por favor comente.


/**
* Valida uma string de data
* @param {string} sData Uma string de data
* @return verdadeiro se a data é válida
*/
function testaData(sData) {
if (!sData.length) return false;
var datamat = sData.split('/');
if (datamat.length < 3) return false;
var dia = (datamat[0].charAt(0) == '0') ? parseInt(datamat[0].slice(1)) : parseInt(datamat[0]);
var mes = (datamat[1].charAt(0) == '0') ? parseInt(datamat[1].slice(1)) : parseInt(datamat[1]);
var ano = parseInt(datamat[2]);
if (ano < 1800) return false;
var data = new Date(ano, (mes - 1), dia);
var datastr = "" + dia + mes + ano;
var dataconvertida = "" + data.getUTCDate() + (data.getMonth() + 1) + data.getFullYear();
return(datastr == dataconvertida);
}

Que maravilha, o verão está oficialmente instalado aqui. Temperaturas acima de 35C na minha sala têm sido constantes nos últimos dias, ainda mais com o A/C quebrado e muita poeira lá fora.

Linux oferece uma maneira fácil para manipular as propriedades do seu hardware: arquivos de texto. O controle depende do seu hardware. Por exemplo, os fans precisam estar conectados na placa mãe (e não na fonte), os fans precisam ter o terceiro cabo para ler a velocidade (se você quiser ler), e a placa mãe precisa dar suporte a tudo isso (e o Linux entender tudo). O padrão é o seguinte:

  • Fans
    • Podem ser ligados, desligados e ter sua velocidade controlada por PWM. Este ajuste permite escolher entre fritar o computador (ou partes dele) ou morrer surdo.
    • /sys/class/hwmon/hwmon0/device/ contém estes, entre outros arquivos interessantes:
      • tempX_input
        X é um número de 1 a X sensores de temperatura identificados na sua placa mãe.
        Armazena a temperatura deste sensor, em Celsius * 1000.
        A qualidade desse dado vai depender do suporte que o Linux dá à sua placa mãe.
        Eg:
        $ cat temp3_input
        40500
        …mostra uma temperatura de 40.5C no sensor 3. No meu caso, o sensor 3 está embaixo do processador.
      • tempX_max
        X é um número de 1 a X sensores de temperatura identificados na sua placa mãe.
        Armazena a temperatura máxima que este sensor deve alcançar, em Celsius * 1000.
        $ cat temp3_max
        60000
        …mostra uma temperatura de 60C no sensor 3. A partir de 60C a placa mãe começa a apitar.
      • beep_enable
        Define se vai haver aviso sonoro caso alguma temperatura fique acima do tempX_max.
        Como na maior parte dos arquivos liga/desliga, 1 significa ‘sim, apite’, 0 significa ‘não’. O apito vai depender de outros detalhes do sistema, como o módulo pcspkr. Geralmente as placas mãe apitam sozinhas, mas melhor ser redundante.
      • pwmX
        Meu favorito, controla a velocidade do fan. Aceita números de 0 a 255. Os fans velhos que tenho aqui começam a rodar entre 50 e 60, na velocidade mínima, e rodam na velocidade máxima com pwm 255. Para ler:
        $ cat pwm1
        121

        … e para setar (apenas como root)
        # echo 255 > pwm1
        Note que é necessário ser root, o que você pode conseguir com
        $ sudo -i
      • fanX_input
        Mostra a velocidade instantânea do fan, em RPM. Para ler
        $ cat fan1_input
        1757
        que significa 1757 RPM para o fan1, neste caso é o que fica sobre o processador.
  • Processador
    • Pode ter sua freqüência controlada automaticamente (por demanda) ou fixa.
    • /sys/devices/system/cpu/cpu0/cpufreq contém estes, entre outros arquivos interessantes:
      • scaling_cur_freq
        É a freqüência atual do processador, em Hz. Para ler:
        $ cat scaling_cur_freq
        1000000

        … ou seja, este está a 1GHz no momento.
      • scaling_available_frequencies
        São as freqüências nas quais este processador pode trabalhar. Por exemplo:
        $ cat scaling_available_frequencies
        1800000 1000000

        mostra que este processador pode trabalhar a 1GHz ou 1.8GHz.
      • scaling_available_governors
        Mostra todos os tipos de controle disponíveis para este processador.
        $ cat scaling_available_governors
        powersave userspace ondemand conservative performance

        Estes serão os valores disponíveis para o seu scaling_governor, onde powersave vai colocar o seu processador em velocidades mais baixas, performance vai colocar seu processador nas velocidades mais altas (ideal para jogos), e userspace para você fazer o controle na mão.
      • scaling_governor
        $ cat scaling_governor
        ondemand

        mostra que estamos com a freqüência sendo ajustada automaticamente. Neste calor, não é uma boa idéia, pois prefiro esperar um resultado a fritar a máquina. Vamos mudar para outra coisa:
        # echo "powersave" > scaling_governor
        …fará com que este processador funcione apenas a 1GHz.

Tudo isso depende do suporte do seu hardware e de alguns módulos que fariam este artigo muito longo. Os fans podem ser controlados automaticamente pelo fancontrol, ou você pode até escrever o seu shell script para controlá-los: basta ler e salvar arquivos. Para mais informações, deixe um comentário.

Para a motherboard, use um pacote chamado lm-sensors. Para instalar:
# apt-get install lm-sensors

lm-sensors requer algumas tentativas para configurar, mas em computadores mais novos isto é geralmente feito de forma automática.

Para os HDs, use um pacote chamado hddtemp, que é um programa bastante simples. Para instalar:
# apt-get install hddtemp

Para usar o hddtemp, nada mais simples:
# hddtemp /dev/[seu drive]
onde [seu drive] deve apontar para o HD a ser medido, como por exemplo /dev/hda ou /dev/sda.

Para ter controle completo dos ventiladores, use o pacote fancontrol. O fancontrol permite que voce controle a velocidade de cada ventilador que a motherboard permitir ligar/desligar via software. Este pacote é bastante útil se você acha que seu computador está barulhento mas requer alguns cuidados pra configurar. Quer saber mais? Deixe um comentário.

Um dos serviços que prestamos é adaptar rotinas Javascript de aplicativos para que funcionem não somente no Internet Explorer mas também no Firefox.

Os eventos no Internet Explorer são acessíveis de diferentes formas, dependendo de como foram anexados aos elementos HTML da página enquanto que no Firefox eles vem sempre como parâmetro na função do evento.

Se um evento é anexado a um elemento utilizando o formato DOM nível 0:

elemento.onclick = função;

Então o evento aparece apenas como uma propriedade no objeto window no Internet Explorer.

Dessa forma é recomendado utilizar o seguinte código para detectar um evento nos dois navegadores:

var divBotao = document.getElementById("divBotao");
divBotao.onclick = function(oEvento)
{
  var oEvt = oEvento ? oEvento : window.event; // linha de detecção
  alert("O Tipo do Evento é: " + oEvt.type);
};

A mídia brasileira e provavelmente do mundo já soltou diversas notícias catastróficas acerca da nuvem sobre Sydney esta manhã. Porém:

5h40am: O Departamento de Meteorologia de New South Wales (estado daqui de Sydney) soltou uma recomendação de que haveriam ventos fortes (até 100km/h, nada pra se alarmar) e poeira.
6h00am: O céu estava vermelho. Na verdade acordei com a poeira. Na verdade mesmo acordei achando que a poeira era por não ter limpado a casa neste final de semana.
6h30am: O serviço de balsas começa a operar mais devagar e chega a parar por alguns instantes. Alguns poucos vôos são redirecionados. Ônibus e trem operam normalmente.
7h00am: É o horário que as pessoas começam a sair de casa. Algumas se atrasaram. Demorou um pouco pro pessoal sair hoje.
7h30am: Movimento normal nas estações de trem e pontos de ônibus. Ônibus está sempre atrasado mesmo, então a lentidão nem foi muito perceptível. Algumas pessoas estavam cobrindo o nariz como podiam.
8h00am: Medrosos e preguiçosos, alguns dos motoristas resolveram usar o transporte público. Não só a visibilidade limitada na rua, mas também o fato de ter que limpar a casca de poeira sobre os vidros e faróis. Quem dirigiu se divertiu.
8h40am: tudo normal, apenas 10 minutos atrasado. Lojas abertas, comércio funcionando.

São só uns 3500km de deserto entre aqui e Perth. Essas coisas acontecem – não aqui em Sydney, mas acontecem. Neste evento, a causa foram as cheias nos meses anteriores no sudoeste de Queensland, em Lake Eyre, dos rios Diamantina, Georgina e Cooper Creek. Essas cheias depositam sedimentos por uma grande área e tocam o frágil ecosistema da região. Neste atual período de seca, estes sedimentos ficam expostos. Um vento constante e forte soprando na direção certa (leste) levantou este sedimento fino e carregou-o, através do oeste seco de New South Wales, até chegar aqui de manhã.

Também não é certo culpar o aquecimento global ou poluição. “Nós sempre tivemos tempestades de poeira. Temos bastante evidência de que, durante a última era do gelo, tínhamos poeira sendo soprada pelo hemisfério sul, muita dessa vindo da Austrália.”, diz o professor Nigel Tapper, da Univerdade de Monash. E ainda mais, continuando o professor Tapper, contando que nos últimos 50 a 70 anos práticas agrícolas mais adequadas fizeram o solo bastante resiliente a erosão e vento, reduzindo o risco de eventos como esse.

A areia do deserto australiano é rica em óxido de ferro, que absorve a luz azul e faz com que o céu fique vermelho. Este óxido de ferro também é importante quando depositado no oceano, pois fertiliza o plâncton, que por sua vez absorve dióxido de carbono da atmosfera. Ordem de grandeza: 4 milhões de toneladas de poeira, extensão de 2400x400x2 km.

Recomendo a segunda edição deste livro (em inglês) para quem quer aprender mais sobre Javascript:

javascript livro 1

Professional Javascript for Web Developers

É um livro que trata de Javascript de forma séria.

O livro explica entre outros tópicos que o Javascript é composto de 3 partes: ECMAScript (a linguagem de programação), DOM (Document Object Model) e BOM (Browser Object Model).

O ECMAScript é a linguagem que também é utilizada em outras plataformas como ActionScript.

O livro também explica a diferença das implementações de DOM e BOM dos diversos navegadores do mercado e fornece código que roda em todos os browsers.

Abaixo a lista de capítulos traduzida:

  1. O que é o Javascript?
  2. Javascript no HTML
  3. Básico da Linguagem
  4. Variáveis, Escopo e Memória
  5. Tipos de Referência
  6. Programação Orientada a Objetos
  7. Funções Anônimas
  8. O Modelo de Objetos do Navegador (BOM)
  9. Detecção de Clientes
  10. O Modelo de Objetos do Documento (DOM)
  11. DOM Níveis 2 e 3
  12. Eventos
  13. Scripting de Formulários
  14. Manipulação de Erros e Depuração
  15. XML em Javascript
  16. ECMAScript para XML
  17. Ajax e JSON
  18. Técnicas Avançadas
  19. Armazenamento do Lado do Cliente
  20. Boas Práticas
  21. APIs A Caminho
  22. A Evolução do Javascript

E os apêndices:

  • Bibliotecas Javascript
  • Ferramentas Javascript

Participei pela primeira vez de um GDD que aconteceu ontem no Hotel Sheraton WTC.

O evento durou o dia todo, com vários palestrantes.

Abaixo um resumo das sessões que escolhi participar.

Google Wave com Stephanie Hannon e Torsten Nelson

O Wave é uma nova tecnologia de comunicação em desenvolvimento que parece um mashup de e-mail, fórum, chat e enquete com a possibilidade de acoplar plugins. Ele foi criado com a idéia de tornar a comunicação eletrônica mais dinâmica e fácil. Com ele é possível inclusive fazer um “replay” de cada interação que existiu em torno de um determinado tópico.

É um produto que também permite que desenvolvedores criem plugins diversos. Um dos plugins demonstrados traduzia em tempo real a conversa em chat de duas pessoas que utilizavam idiomas diferentes.

Cloud Computing/App Engine com Michael Repass

As duas sessões sobre cloud computing foram dedicadas a um outro produto em desenvolvimento do Google chamado App Engine.

O App Engine é um framework web que permite hospedar um projeto dentro da infra-estrutura do Google e até mesmo utilizar o padrão de banco de dados da empresa (Big Table).

É recomendado para aplicações web que requerem uma arquitetura escalável, redundante e fácil de gerenciar.

Um dos recursos mais pedidos pelos desenvolvedores e que por incrível que pareça ainda não está disponível no App Engine, é a busca completa de texto dentro dos campos do Big Table. Algo similar a um LIKE ‘%’ do SQL.

Perguntei para o Michael sobre este recurso e ele disse que os engenheiros estão trabalhando nele e que será disponibilizado futuramente.

Para saber mais sobre o google App Engine consulte:

http://code.google.com/appengine

Tradução App Engine em português

Google e a Web Social com Patrick Chanezon

Nesta palestra o Patrick explicou como funciona a programação de aplicações para plataforma Open Social.

Desenvolver para Open Social é desenvolver para Engage.com, Friendster, hi5, Hyves, imeem, LinkedIn, MySpace, Ning, Oracle, Orkut, Plaxo, Salesforce.com, Six Apart, Tianji, Viadeo e XING.

O Buddy Poke é um exemplo de aplicativo Open Social que utiliza na retaguarda o App Engine.

HTML 5 com Patrick Chanezon

O HTML 5 traz muitas inovações, algumas delas presentes até então apenas em plugins como Flash e Silverlight.

Entre os novos recursos estão audio e video nativos, superfície “canvas” para gráficos vetoriais, melhor suporte a armazenamento no navegador e aplicativos offline.

Em breve o Google vai disponibilizar os videos e fotos do evento.

Da Wikipedia:

“Subversion (SVN) é um sistema de controle de versão iniciado em 2000 pela CollabNet Inc. É utilizado para manter um histórico de versões de arquivos como código fonte, páginas web e documentação.

Seu objetivo é ser um sucessor inteiramente compatível ao amplamente utilizado Concurrent Versions System (CVS).”

Resumo

O SVN é muito utilizado pela comunidade open-source onde os desenvolvedores trabalham no mesmo projeto de forma distribuída ao redor do globo.

Ele funciona em uma arquitetura cliente servidor onde todos os arquivos de um projeto ficam em um servidor SVN e os desenvolvedores mantém uma cópia de trabalho local em seus próprios micros, sincronizando com o servidor através de um software cliente SVN.

Assim, quando um desenvolvedor realiza uma modificação na árvore do projeto, como por exemplo alterar o conteúdo de um arquivo, ele deve informar o servidor SVN para que este mantenha-se atualizado. Dessa forma, outros desenvolvedores que se conectarem ao servidor saberão que existem modificações nos arquivos do projeto em relação a sua cópia de trabalho local.

Cada modificação tem um histórico/log, onde o desenvolvedor digita um texto sobre o que foi alterado.

Cada vez que a árvore do projeto for modificada, não importa se houve alteração em um único arquivo, o projeto ganha um novo número de revisão.

O SVN é considerado uma “máquina do tempo” pois permite que você restaure versões antigas dos arquivos e examine o histórico/log de como e quando os dados foram alterados e quem os alterou.

Existem muitas funcionalidades no SVN e com o tempo adquire-se prática na utilização delas.

O servidor SVN é um servidor de arquivos?

Apesar do funcionamento do servidor SVN ser parecido com um servidor de arquivos tradicional existem algumas diferenças.

Não é possível baixar os arquivos que nele estão sem utilizar um software cliente SVN ou ferramentas específicas.

Isso acontece porque o servidor SVN mantém árvores de projetos em um formato próprio, mantendo um controle do que foi alterado de uma revisão para outra.

É por isso que a cada nova revisão do projeto, não há duplicação de todo o conteúdo. Apenas o que foi alterado de uma revisão para outra é que fica armazenado.

Como servidor SVN, utilizamos o gratuito VisualSVN.

O que é um cliente SVN?

O cliente SVN é o software que se comunica com o servidor SVN permitindo funcionalidades como baixar a revisão mais atual do projeto, atualizar arquivos no servidor, reverter arquivos da cópia de trabalho local ao estado anterior, etc…

Existem 3 tipos de clientes:

1. Linha de comando (prompt);
2. Integrado ao Explorer do Windows;
3. Plugin para IDEs (Eclipse, Visual Studio, etc…);

Os tipos 2 e 3 são os mais práticos de utilizar.

O TortoiseSVN

O cliente SVN que escolhemos para utilizar pode ser baixado aqui: http://tortoisesvn.net/downloads

TortoiseSVN é um cliente gratuito open-source prático, basta clicar com o botão da direita sobre uma pasta ou arquivo para ver as funcionalidades do SVN no menu de contexto.

Importante:

  • O TortoiseSVN requer BOOT DO SISTEMA do sistema pois fica integrado ao Windows Explorer.
  • Existe versão específica para Windows 64 bit pois a versão 32 bit não funciona corretamente neste sistema operacional.

Depois de instalar o TortoiseSVN em seu sistema, você pode instalar também o pacote para a língua portuguesa no mesmo local onde baixou o executável Tortoise.

Subversion em ação

Chamamos de repositório o local no servidor SVN que armazena os projetos e seus arquivos.

Este repositório que está no servidor é acessado pelo cliente SVN utilizando um URL parecido com:

https://IP_do_Servidor_SVN:8443/svn/nome_do_projeto/trunk

O trunk “tronco” nada mais é do que os arquivos principais do projeto pois o SVN também nos dá a possibilidade de criar ramificações “branches” do projeto sem alterar os arquivos principais. Isto é útil em casos como por exemplo o desenvolvimento de uma nova versão de teste de um determinado software.

Cópia de trabalho é uma pasta comum no seu micro que contém uma cópia dos arquivos do projeto (que está no servidor) entretanto é sua área privativa e o SVN não irá incorporar nesta cópia as mudanças que outros desenvolvedores fizeram sem sua expressa solicitação.

Da mesma forma, o SVN não disponibilizará a outros desenvolvedores as modificações que você fez até você solicitar.

Depois que você fizer algumas modificações nos arquivos da sua cópia de trabalho, o SVN te dará no menu de contexto do Windows Explorer comandos para publicar suas mudanças no servidor SVN para que outros desenvolvedores trabalhando com você tenham acesso a estas modificações. Por isso as modificações devem ser testadas antes de serem enviadas ao servidor.

Se outros desenvolvedores publicarem suas próprias modificações (no servidor SVN) nestes mesmos arquivos antes que você tenha publicado então estas mudanças entrarão em conflito com as suas e o cliente SVN te dará comandos no menu para mesclar tais mudanças na sua cópia de trabalho manualmente. Uma vez resolvidos estes conflitos, você deve realizar esta publicação. Mais sobre isso abaixo.

Testando

Consideramos que você já tenha baixado e instalado o software cliente TortoiseSVN e que tenha um servidor SVN com um repositório chamado “teste” para realizar o teste abaixo.

  1. Escolha uma pasta onde armazenará os fontes dos projetos
  2. Dentro desta pasta crie uma pasta “teste”
  3. Clique com o botão da direita sobre a pasta teste e escolha a opção SVN Obter (Checkout)
  4. Na caixa de diálogo, digite o URL do repositório acima e clique no botão OK

Digite seu login e senha se for a primeira vez que acessa o servidor e salve-o.

Se tudo ocorreu como esperado, o Tortoise obterá do servidor SVN a última revisão do projeto teste salvando os arquivos e pastas no seu diretório local “teste”. Observe a janela para relata o processo.

Experimente criar um novo arquivo neste diretório “teste” com seu nome e extensão .txt, por exemplo “seunome.txt”. Note que ao fazer isso aparecerá um ícone de interrogação sobrepondo o ícone do arquivo. Isso significa que o arquivo não está sob controle de versão.

Abaixo um resumo dos ícones do SVN que aparecem em sua pasta “teste” no Windows Explorer.

Ícones do TortoiseSVN

Significado dos ícones:

Normal
Foi obtida uma cópia “fresca” do arquivo/pasta e este ícone significa que o estado é normal.

Modified
Assim que você começa a editar um arquivo, seu estado muda para modificado (modified) e o ícone se torna um exclamação vermelho. Você pode ver facilmente quais arquivos foram alterados desde que você modificou sua cópia de trabalho e que devem ser atualizados no servidor.

Conflict
Se durante uma atualização ocorrer um conflito (conflict) então o ícone se torna um exclamação amarelo.

Read-only
Se você travar um arquivo somente para leitura, o SVN faz aquele arquivo ficar somente para leitura até que você destrave.

Locked
Se você manter uma trava em um arquivo e o estado SVN dele for normal, este ícone te lembrará que você deve destravá-lo se não estiver mais utilizando-o para permitir que outros desenvolvedores atualizem as modificações que fizeram neste arquivo.

Deleted
Este ícone mostra que alguns arquivos ou pastas dentro da pasta atual foram marcados para serem deletados do controle de versão ou um arquivo com controle de versão está faltando dentro de uma pasta.

Added
O sinal de adição indica que um arquivo ou pasta foi marcado para ser adicionado ao controle de versão.

Ignored
Este ícone de barra diz que um arquivo ou pasta é ignorado para propósitos de controle de versão.

Unversioned
Este ícone mostra arquivos e pastas que não estão sob controle de versão mas não foram ignorados.

Menus de contexto

Abaixo um resumo dos principais comandos utilizados do menu de contexto do TortoiseSVN no Windows Explorer.

Importar (Import):

Envia o conteúdo de uma pasta local para um repositório no servidor SVN. Normalmente é utilizado pelo responsável pelo repositório ou projeto para preparar o servidor para o trabalho em equipe. Utilize com cuidado.

Antes de importar você deve remover todos os arquivos que não são necessários para construir/compilar o projeto (por exemplo arquivos temporários, arquivos objeto, etc…).

Para importar, selecione a pasta de nível superior da estrutura de diretório do seu projeto no Windows Explorer e clicando com o botão da direita selecione TortoiseSVN->Importar. Digite a URL do repositório para onde quer enviar seu projeto.

Obter (Checkout):

Obtém do repositório (no servidor SVN) uma cópia de trabalho local do projeto.

Selecione uma pasta no Windows Explorer onde você quer colocar sua cópia de trabalho. Clique com o botão da direita no menu de contexto e selecione TortoiseSVN->Obter.

Submeter (Commit):

Enviar as modificações que você realizou na sua cópia de trabalho é conhecido como submeter (commit). Antes de você submeter, você deve ter certeza que sua cópia de trabalho está atualizada. Você deve utilizar a opção TortoiseSVN->Atualizar (Update) ou TortoiseSVN->Verificar alterações (Check for Modifications).

Se a sua cópia de trabalho está atualizada e não há conflitos, você está pronto para submeter suas modificações para o repositório. Selecione qualquer arquivo e/ou pasta que você quer submeter e selecione TortoiseSVN->Submeter (Commit) no menu de contexto do Windows Explorer.

A caixa de diálogo de submeter mostrará todos os arquivos modificados incluindo arquivos adicionados, deletados e sem controle de versão. Se não quiser submeter um arquivo desmarque a caixa correspondente. Se quiser adicionar um arquivo sem controle de versão selecione a caixa correspondente para submetê-lo.

Ao submeter, você deve digitar uma mensagem de histórico/log que descreve as modificações que você realizou. Este é um grande benefício do SVN e ajudará em outras ocasiões se bem utilizado.

Atualizar (Update):

Periodicamente você deve se certificar que as modificações realizadas por outros desenvolvedores sejam incorporadas na sua cópia de trabalho local. Este processo de baixar as modificações do servidor para sua cópia local é chamado de atualização. Esta atualização pode ser feita com arquivos individuais, um conjunto de arquivos ou recursivamente em toda hierarquia de diretório.

Para atualizar, selecione os arquivos e/ou pastas que você quer e clique com o botão da direita selecionando TortoiseSVN->Atualizar (Update) no menu de contexto. Uma janela exibirá o progresso. As modificações realizadas por outros serão mescladas aos seus arquivos, mantendo quaisquer modificações que você tenha realizado nos mesmos arquivos num formato próprio para resolução de conflitos. Mais sobre isso abaixo.

O repositório não é afetado por uma atualização pois os arquivos e pastas saem do servidor em direção a sua cópia de trabalho local.

A atualização padrão não tem opções e apenas atualiza sua cópia de trabalho para a revisão HEAD que é a mais recente.

Se você quer mais controle sobre o processo de atualização pode utilizar a opção TortoiseSVN->Atualizar para Revisão (Update to Revision). Isto permite que você atualize sua cópia de trabalho para uma revisão específica e não necessariamente a mais recente.

Comparar (Diff):

Um dos requisitos mais comuns no desenvolvimento de projeto é ver o que foi alterado. Você pode querer ver as diferenças entre duas revisões do mesmo arquivo ou a diferença entre dois arquivos separados.

Para ver quais modificações você fez na sua cópia de trabalho simplesmente utilize o menu de contexto do Windows Explorer e selecione TortoiseSVN->Comparar (Diff).

Se você quiser ver a diferença entre uma revisão em particular e sua cópia de trabalho utilize TortoiseSVN->Comparar com revisão anterior (Diff with previous version).

Resolvendo Conflitos

Possivelmente haverá conflitos quando você atualizar/mesclar seus arquivos com o repositório. Existem dois tipos de conflitos:

  • conflitos de arquivos
  • conflitos de árvore

Um conflito de arquivo ocorre quando dois (ou mais) desenvolvedores modificaram as mesmas linhas de um arquivo. Quando isso ocorre, você deve abrir o arquivo em questão e procurar pelas linhas que começam com <<<<<<<. A área de conflito é marcada assim:

<<<<<<<< nomedoarquivo
suas modificações
=======
código mesclado do repositório
>>>>>>> revisão

Além disso para cada arquivo com conflito Subversion coloca três arquivos no seu diretório:

nomedoarquivo.ext.mine

Este é seu arquivo como existia na sua cópia de trabalho antes de você efetuar uma atualização com o servidor, ou seja, sem os marcadores de conflito. Este arquivo possui suas últimas modificações.

nomedoarquivo.ext.rREVANTIGA

Este é o arquivo base da revisão, antes de você atualizar sua cópia de trabalho, ou seja, este arquivo que você obteve antes de efetuar suas modificações.

nomedoarquivo.ext.rREVNOVA

Este é o arquivo que seu cliente SVN acabou de receber do servidor quanto você efetuou uma atualização da sua cópia de trabalho. Este arquivo corresponde à revisão HEAD do repositório, ou seja, a revisão mais recente que possui as modificações recentes de outros desenvolvedores.

Você pode lançar um ferramenta externa de edição de conflito com a opção TortoiseSVN->Editar Conflitos (Edit Conflicts) ou você pode manualmente resolver o conflito. Você deve decidir como o código deve ser, fazer as modificações necessárias e salvar no arquivo .mine.

Depois que fizer isto, execute o comando TortoiseSVN->Resolvido (Resolved) e submeta suas modificações para o repositório. Note que o comando Resolvido não resolve o conflito, ele apenas remove os arquivos nomedoarquivo.ext.mine, nomedoarquivo.ext.rRAVANTIGA e nomedoarquivo.ext.rREVNOVA permitindo que você execute o TortoiseSVN->Submeter (Commit) para aí sim, subir para o repositório suas modificações.

Se você tiver problemas com arquivos binários, Subversion não tentará mesclar os arquivos ele próprio. O arquivo local permanecerá o mesmo e você terá os arquivos da revisão antiga e da nova como o exemplo acima. Se você quiser descartar suas modificações e manter a versão do repositório, então apenas utilize o commando Reverter (Revert) do menu. Se você quiser manter sua versão e sobrepor a versão do repositório, utilize o comando Resolvido (Resolved) e submeta sua versão.

Você pode utilizar o comando Resolvido (Resolved) para vários arquivos se você clicar na pasta superior e selecionar TortoiseSVN->Resolvido. Isto exibirá uma caixa de diálogo listando todos os arquivos conflitantes naquela pasta e você poderá selecionar quais estão resolvidos.

Antes de utilizar o comando Resolvido, verifique se você mesclou corretamente suas modificações com as de outros desenvolvedores pois ao efetuar em seguida um Submeter, suas modificações serão salvas sobre o que já existe no repositório.

Um conflito de árvore ocorre quando um desenvolvedor move/renomeia/deleta um arquivo ou pasta, que outro desenvolvedor também tenha movido/renomeado/deletado ou apenas modificado. Existem várias situações que podem resultar num conflito de árvore e requerem formas diferentes de resolver.

Quando um arquivo é deletado localmente no Subversion, o arquivo também é deletado do sistema de arquivos local, então mesmo que seja parte de um conflito de árvore ele não pode exibir um estado de conflito e você não pode clicar com o botão da direita nele para resolver o conflito. Ao invés disso, utilize Verificar Modificações (Check for Modifications) para acessar a opção Editar conflitos (Edit conflicts).

O TortoiseSVN pode ajudar a encontrar o local certo para mesclar as modificações mas pode haver trabalho adicional necessário para acertar os conflitos. Lembre-se que depois de uma atualização a BASE de trabalho terá sempre a revisão de cada item como era no repositório no momento da atualização. Se você reverter uma modificação depois de atualizar, ela voltará ao estado do repositório e não como era quando você começou a fazer modificações locais.

Estas são as funcionalidades básicas do SVN, para mais informações você pode consultar também o manual do usuário em:

http://tortoisesvn.net/support

XDebug é um pacote de debug e análise para PHP, provendo informações úteis como uso de memória, rastreamento de funções e pilhas, e desempenho.

KCacheGrind é um aplicativo para análise de dados de desempenho como os gerados pelo XDebug. Tem vários recursos gráficos para visulizar a execução do programa sendo analisado e os recursos utilizados por cada unidade deste programa.

O XDebug não deve ser instalado em máquinas de produção pois causa uma carga extra em função de suas análises. A instalação dos pacotes em distribuições baseadas em Debian (Debian/Ubuntu/XUbuntu) se dá pelo comando:
apt-get php5-xdebug kcachegrind graphviz

A análise de desempenho (profiler) deve ser adicionada ao seu php.ini (em /etc/php5/apache2/php.ini). O valor 1 liga a análise, 0 desliga a análise.
xdebug.profiler_enable = 1

Após a alteração, reinicie o Apache.
/etc/init.d/apache2 restart

A cada execução, o XDebug criará um arquivo em /tmp com os dados da análise de desempenho. O nome do arquivo será parecido com
cachegrind.out.*
onde * é o número do processo apache que deu origem a esta análise. É um arquivo de texto puro.

Aqui entra o KCacheGrind. Abra o arquivo cachegrind.out.* e veja onde seu script está gastando mais tempo. Otimize primeiro o que está gastando mais tempo. A unidade de tempo do KCacheGrind é simplesmente uma unidade de tempo e não o tempo de execução em milisegundos.

Como otimizar? Isso fica pra outro post.

Maiores informações:
http://kcachegrind.sourceforge.net/html/Home.html
http://www.xdebug.org/
ou deixe um comentário.

O Fluxo PHP é uma aplicação web que estamos desenvolvendo desde o início do ano de 2009 paralelamente a outros projetos.

Já está sendo utilizado por um de nossos clientes.

Possui um sistema simplificado de registro de entidades (PF e PJ), contas a pagar e receber e relatório de fluxo de caixa, além de uma tela de acesso rápido com informações financeiras da empresa.

A partir de agora passamos a chamar a versão de desenvolvimento de 1.0 alfa 1 (1.0a1).

Nesta última versão realizamos algumas mudanças maiores como:

  • Telas da aplicação foram incluídas em um único arquivo HTML
  • Navegação bloqueada enquanto carregamentos não são finalizados para não confundir o usuário
  • Janela de edição de entidades e contas agora pode ser movida
  • Simplificação do arquivo de login

Mais notícias em breve.

Aparentemente o IE 7 tem um problema que impede que cookies/variáveis de sessão sejam lidos em certas circunstâncias.

Ocorre quanto utilizamos o localhost como servidor web e o nome do subdomínio tem um caracter sublinhado (underscore), por exemplo:

http://teste_bug.localhost

Neste caso, basta reconfigurar o servidor removendo o sublinhado do nome do subdomínio para que as variáveis de sessão funcionem.

Ainda não sei se o Internet Explorer 8 corrige este problema.

Este problema não afeta o Firefox e Chrome.

As vezes é mais fácil procurar na internet a resposta para um problema que temos do que procurar no manual, por mais simples que o problema possa ser.

Vamos lá, este é simples…

Para que você possa desenvolver e testar vários sites diferentes na mesma máquina você pode configurar Virtual Hosts no Apache 2.2.

Siga os passos abaixo, considerando que você utiliza Windows.

  1. Configure seu arquivo HOSTS do Windows para responder por outros hosts além do localhost. Para isso edite o arquivo HOSTS que no Windows Vista está em:

    C:\Windows\System32\drivers\etc

  2. Acrescente linhas referentes ao seus subdomínios por exemplo:

    #configuração original

    127.0.0.1 localhost
    ::1 localhost

    #linhas adicionadas

    127.0.0.1 teste.localhost
    127.0.0.1 cliente1.localhost

  3. No arquivo de configuração do Apache (httpd.conf) remova o comentário da linha:

    # Virtual hosts
    Include conf/extra/httpd-vhosts.conf

  4. No arquivo httpd-vhosts.conf, adicione um grupo de linhas de configuração para cada novo subdomínio como o exemplo:

    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot "D:/Projetos/teste"
        ServerName teste.localhost
        ErrorLog "logs/teste-error.log"
        CustomLog "logs/teste-access.log" common
        <Directory />
            Options Indexes FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
        </Directory>
    </VirtualHost>

  5. Reinicie o Apache.

“Quero voltar a programar em C++”, disse-me o admin.

Mas a nossa realidade é serviços Web. Para web, no que diz respeito a desempenho, temos PHP e Python. Grandes comedores de memória quando se trata de desempenho, ou uso excessivo de cache.

Memória hoje é barata. Potência em servidores também. E também temos clouds. E para ter sucesso financeiro no desenvolvimento Web é preciso conseguir finalizar projetos rapidamente. O uso de PHP, Python ou outra linguagem de alto nível, por si só, não identifica de forma alguma que o projeto será de rápido desenvolvimento ou que sua manutenibilidade será boa.

O rápido desenvolvimento só é possível com uma análise bem feita do projeto em si, e este passo envolve o levantamento dos requisitos junto ao cliente e o planejamento do sistema em si. A manutenibilidade é quase que um produto disso, sendo conquistada com a união dos requisitos bem definidos, um bom planejamento, e por fim e com um controle rígido dos programadores para que sigam o Manual de Estilo e Qualidade da empresa.

A web não passa de texto entra (uma requisição pro servidor Web) e texto sai (uma resposta do mesmo servidor Web). Todo o resto é firula que interpreta o texto que entra e organiza o texto que sai. Ao ler um endereco como http://www.id8games.com/, tudo o que o servidor Web tem que fazer é ir buscar naquilo que ele foi programado o texto adequado de resposta. É imprescindível que a resposta seja entregue rapidamente, pois um bom site é sempre um site rápido – uma página que leva 8s pra carregar já perde 30% de internautas impacientes.

Ora, a geração deste texto pode ser feita de qualquer forma. Pode ser um texto estático, pode ser um script PHP lendo algo de um banco de dados. Então o que impede de ser C++? C++ oferece OOP, conexão com banco de dados, conexão com Apache, linguagem sólida com um monte de desenvolvedores sérios espalhados no mundo, livros e wikis e foruns e cursos etc. Será tão penoso gastar 5s compilando seu código? Lembre-se que pelos mesmos US$89 que você paga no seu dedicado você vai conseguir colocar 5x mais clientes.

E brincando aqui, apesar de trabalhar cerca de 40 horas por semana em PHP, pude ver que C++ é apenas um pequeno pulo. Aqui tem outros caras que tem brincado com C++ pra Web.

Subversion é um sistema de controle de versões. Parecido com o seu sucessor predecessor CVS, permite que você e outros controle controlem cada alteração realizada em um projeto, analiseanalisem o histórico dessas alterações, os responsáveis por cada alteração, etc.

Este link mostra como instalar e usar Subversion no Ubuntu Gutsy Gibbon. Na verdade, em qualquer distro baseada em Debian o processo será bem parecido.