terça-feira, 19 de junho de 2012

Erro 404 Magento Connect (Magento Downloader)

Passei muito tempo tentando encontrar a solução para esse erro. Infelizmente não vou poder explicar a solução, apenas disponibilizá-la.

Primeiro, se você viu esse erro antes de aparecer a tela de login, é apenas um problema de permissão. Coloque a pasta downloader/ com permissão 755 e o arquivo index.php dentro dela com 644 e pronto.

Se após tentar de tudo, você depois de informar os dados de acesso no magento connect não consegue conexão, o problema é no servidor. Aparentemente algum problema com a conexão com o MySQL. Utilizei o componente pdo.so definido no php.ini na pasta raíz do magento. Porém essas configurações não foram herdadas na pasta downloader/. Foi só copiar o php.ini com as configurações de módulos necessários para a minha instalação do magento para a pasta downloader/ e pronto. Funcionou!

sábado, 2 de junho de 2012

A importância da análise de cada caso particular no desenvolvimento de sistemas

Irei retratar nesse texto uma experiência que estou tendo ao desenvolver um sistema em que os requisitos não foram bem definidos. Irei dar dicas baseado nessa experiência para que outros desenvolvedores, principalmente iniciantes façam um trabalho bem feito, com cumprimento de prazos e por um valor justo.

É difícil imaginar desenvolver um site de conteúdo simples utilizando contrato de escopo aberto (é claro que dependendo da necessidade, se houver funcionalidades que são um pouco fora do comum e são muito específicos do negócio do cliente), mas um sistema onde as funcionalidades são variáveis e são muito dependentes do negócio do cliente, ou seja, onde será mais trabalhoso utilizar um sistema pronto e adaptar às necessidades do que criar do zero (leia-se criar do zero desenvolver utilizando uma framework, então não totalmente do zero) na minha opinião é a primeira opção que deve ser utilizada.

Recebi um telefonema de uma pessoa com quem trabalhei a algum tempo. Essa pessoa queria que eu fizesse um site para o condomínio. Fui até lá e não era um simples site a ser feito, e sim um sistema que gerencia reservas, cadastro do condômino, automóveis, mural de mensagens e várias coisas. Parece simples? Primeiro erro.

Muitas vezes quando visualizamos o sistema com essas funcionalidades em mente parece ser algo simples. Mas tem um detalhe que muitas vezes esquecemos e é muito importante: O Back-end, ou área do administrador. Nessa área deveremos mais cedo ou mais tarde incluir ACLs (Lista de controle de acesso) para que cada tipo de usuário possa acessar as funcionalidades à ele destinadas (nesse caso: administrador, síndico, porteiro).
O administrador deve poder fazer tudo, inclusive excluir registros, adicionar e editar. Há registros que não desejamos eliminar nunca do sistema, nesse caso deveremos colocar um campo 'ativo' por exemplo para indicar se o registro deve ou não aparecer... E por aí vai!

Além do Back-end, o front-end possui muitos itens que esquecemos como o desenvolvimento da interface, a integração de formulários com ajax e por aí vai...

Sem perguntar muito e sem anotar nada pensei em um preço menor, mas por experiência aumentei o valor, e acharam alto, mas mesmo assim acordaram o valor passado menos um pouco de barganha. Pelo trabalho que já tive estou fazendo esse sistema mais pelo portfólio do que pelo valor pago, pois está saindo bastante barato.

Depois de considerado terminado o sistema, faltando alguns itens, enviei por e-mail para apresentá-lo ao síndico. Me ligaram e disseram que estava OK, só algumas mudanças...

Muitas coisas não foram especificadas, como as regras para as reservas. O formulário que me passaram do condômino não estava bom, teve que ser alterado, o layout da página também, o mural, os classificados....

Meu erro, não colher corretamente os requisitos. É claro que eu tinha idéia do sistema, e até desenvolvi corretamente, mas muitos detalhes passaram por questões de funcionalidades não especificadas.

A partir desse momento comecei a marcar encontros semanais com o Síndico para irmos melhorando o sistema, e dessa forma está quase terminado. É um sistema que me toma bastante tempo e por esse motivo o valor que cobrei inicialmente não foi bom. Mantenho a minha palavra e guardo como experiência.

A partir disso enumero algumas dicas:

  • Utilize um contrato de escopo aberto, é algo incrível no desenvolvimento de software. Quem não sabe o que é isso, leia:  http://www.improveit.com.br/xp/praticas/contrato. Uma das coisas mais interessantes são os entregáveis semanais pois é possível avaliar os requisitos e melhorar o sistema de acordo com as necessidades, além de receber um bom valor pelo trabalho.
  • Cuidado com os clientes que não são experientes com computadores, esse é o caso, o cliente não é muito familiarizado com algumas ferramentas o que prejudica o processo de desenvolvimento, como por exemplo comunicação por e-mail. Se possível tente instruir o seu cliente a trabalhar da melhor forma, utilizando ferramentas boas e produtivas disponíveis.
  • Avalie bem antes de colocar o preço no serviço. Se possível peça um tempo para pensar, mas dê um prazo para enviar a proposta e não fure com esse prazo! Se você não é um programador com portfólio grande, ou é iniciante, não coloque preços altos, mas também não peça valores simbólicos. Peça um valor que te manterá financeiramente enquanto você faz o sistema. Se quiser fazer somente por portfólio, procure alguém que não possa pagar e tenha uma idéia legal e faça de graça. Acredite, no momento que você cobra R$300,00, você ficará pensando que está tendo todo aquele trabalho por R$300,00 e não lembrará muito do seu portfólio. Quando nada é cobrado, você sabe e tem em mente porque está fazendo aquele trabalho. Motivação é muito importante.
    Se o cliente não aceitar o seu preço não faça o trabalho, você tem medo que esse seja a sua única oportunidade? Não é, existem muitas pessoas que querem fazer sistemas mas não tem orientação de como começar ou onde ir buscar, em quem confiar, etc. Vá em busca de outros trabalhos e conseguirá, avalie o cliente, avalie a idéia, dê preços menores com base na situação dele, mas lembre-se: Reverta sua motivação para a boa idéia do cliente e não para o valor que você irá receber.
  • Dê prazos maiores do que o que realmente leva para fazer o trabalho, o cliente quer urgente? Todos querem, mas ele não irá encontrar ninguém que faça o que ele quer bem feito e na velocidade que ele diz que precisa. Diga isso a ele e se ele não aceitar o seu prazo não faça o trabalho. Em casos que você acha que vale a pena, dê o prazo máximo, mas prepare-se para trabalhar mais de 10 horas por dia. E dando prazos maiores não é diferente, comece agora!
  • Redija um contrato. Isso dá profissionalismo, faça um padrão e vá melhorando a cada trabalho.
  • Aceite desafios. Não sabe nem por onde começar? Seja sincero, diga ao cliente que nunca trabalhou com isso mas tem conhecimentos suficientes para pesquisar e fazer um bom trabalho. E vá atrás, não fique esperando cair do céu. Se achar que não tem tempo para descobrir, ou o cliente precisa com uma urgência real, não aceite o trabalho, seja sincero com o cliente. Ele irá te indicar para outra pessoa.
Qualquer dica nova eu posto aqui. Qualquer dúvida, estou a disposição nos comentários.

quinta-feira, 10 de maio de 2012

PrettyPhoto is not a funcion

Tive um problema hoje ao inserir uma galeria do PrettyPhoto. Funcionava normalmente em outra página então simplemente copiei e colei o script jQuery (vindo do Google CDN) e o caminho do script do PrettyPhoto e é claro o link para o CSS do PrettyPhoto.

Mas sempre que eu clicava na imagem era redirecionado para a url da própria imagem (já que é o comportamento padrão caso não sejam carregados os scripts da PrettyPhoto). Porém o script do PrettyPhoto estava linkado e aberto corretamente pelo browser como pude observar no FireBug, assim como o jQuery.

Verifiquei que o erro apresentado era de que "PrettyPhoto is not a function" que significa que a função prettyPhoto que é definida no script PrettyPhoto.js não existe. Mas se ela está declarada porquê não existe?

Depois de buscar bastante, encontrei a solução aqui: http://www.wptavern.com/forum/troubleshooting/1961-thumbnail-linking-3.html - Último Post #24

Então troquei o código


$(document).ready(function() {
$("a[rel^='prettyPhoto']").prettyPhoto();
});


por


jQuery(document).ready(function($) {
$("a[rel^='prettyPhoto']").prettyPhoto();
});

Ainda estou procurando por uma explicação exata do porque não ter funcionado sem passar o objeto jQuery($) por parâmetro. Assim que identificar o porque eu posto aqui. Por enquanto serve como uma dica para salvar o seu dia!

sábado, 10 de março de 2012

#1025 - Error on rename of - MySQL - Erro ao deletar foreign key

Por vezes ao criar uma foreign key no MySQL e errar em sua definição ou mesmo necessitar deletá-la acontece esse erro. No PHPMyAdmin não é possível deletar o índice pois causa o mesmo erro. A solução não é complicada:

ALTER TABLE nome_da_tabela DROP FOREIGN KEY nome_da_foreign_key

Pronto, após esse passo, se ainda houver o índice é só deletá-lo com a mesma instrução acima mudando FOREIGN KEY por INDEX.

Se não criou a foreign key com um nome definido por você veja a lista de índices para saber o nome.

Essa postagem não é uma tradução, mas encontrei a solução nesse artigo: http://wolfram.kriesing.de/blog/index.php/2006/mysql-says-1025-error-on-rename-of-but-means

terça-feira, 27 de dezembro de 2011

Certificação Digital - MEI - Como emitir seu certificado digital (e-CNPJ)

Um certificado digital hoje é essencial para qualquer empresário. A começar pela necessidade de geração de nota fiscal eletrônica.

Para emitir um certificado digital para sua empresa é necessário escolher uma empresa especialista em certificação digital como a Certsign. Fiz a emissão do meu certificado de ontem para hoje e vou listar os passos para adquirir o seu:

1º. A Certsign está com uma promoção especial para micro e pequenos empresários, o valor é de R$189,00 do tipo A3 (que é fornecido no Token). Válido por um ano, mais 6 meses no valor promocional. Ou seja, no total a validade é de 1 ano e meio.

2º Efetue a compra do certificado, o pagamento pode ser feito em até 3x sem juros no cartão ou a vista no boleto. A desvantagem do boleto é a demora na confirmação do pagamento.

3º Após isso é necessário agendar o comparecimento a um ponto de verificação para levar a documentação da sua empresa. Isso é feito através desse link: http://www.certisign.com.br/suporte/certificadosdigitais/e-cnpj/Agendamento que você recebe ao confirmar sua compra.

4º Veja os documentos necessários: http://www.certisign.com.br/suporte/certificadosdigitais/e-CNPJ/Validacao%20e%20Documentos Vou detalhar para o MEI os documentos necessários. Todos os outros passos são válidos para qualquer empresa, mas os documentos listados abaixo são específicos para a validade do MEI:

  • (A) Documentos da empresa:
  • (B) Documentos do empresário (todos com cópia, menos foto 3x4):
    • RG
    • CPF
    • Título de Eleitor (opcional)
    • Comprovante de endereço (conta de água, luz, telefone fixo ou móvel e etc.)
    • Foto 3x4 recente
5º Leve no local e horário marcado os documentos e você sairá de lá com o Certificado digital (e-Token em formato de pendrive).

No próximo artigo explicarei como utilizar seu certificado digital. Até lá!

sexta-feira, 7 de outubro de 2011

Novo Kindle

No início da semana procurei novamente pelo Kindle, um aparelho que desejo comprar algum tempo devido à facilidade de leitura proporcionada por ele. Acabo não conseguindo dedicar tempo à leitura pela manipulação de livros físicos e falta de espaço. Acredito que com o Kindle posso resolver esse problema. 

Quando visitei o site da Amazon tive a surpresa de ver o novo kindle (os novos kindles) que iniciam com seu preço de $79 (dóllares), a versão com propaganda. Somente disponível a versão sem teclado que acabei adquirindo mas não no site da Amazon e sim em um site de compras coletivas. No site da Amazon também vi a versão Touch e o Kindle Fire, que acredito ser uma revolução no mercado de Tablets.

Um ponto que me chamou a atenção foi o texto da página inicial, que diz (tradução livre): "Existem dois tipos de empresas: Aquelas que trabalham duro para fornecer seus produtos a um custo mais elevado e as que trabalham duro para vender os seus produtos pelo menor preço possível. A Amazon se encaixa no segundo grupo". E qualquer pessoa que visite o site e veja o valor de $199 por um produto com a qualidade aparente do Kindle Fire, com os recursos descritos, perceberá que essa frase não é conversa de vendedor.

Segundo o Diário de Pernambuco, cada venda do Kindle gera um prejuízo para a Amazon: "Observadores da indústria afirmam que a varejista está, na verdade, tendo um prejuízo de pelo menos US$ 10 em cada unidade vendida. A IHS iSuppli disse que os componentes empregados na fabricação do Kindle Fire custam US$ 191,65 . Despesas de fabricação adicionais levam o custo total para US$ 209,63.". Fonte: http://www.diariodepernambuco.com.br/nota.asp?materia=20111026080713

 A versão Kindle Touch e Kindle Fire está disponível apenas para pré-venda e para endereços dos US. A versão Kindle Touch e Kindle Fire está disponível apenas para endereços no US. Para adquirí-lo aqui no Brasil é necessário recorrer ao eBay ou pagar absurdo de impostos quando o aparelho chegar por aqui. O lançamento está previsto para 21 de Novembro de 2011 (Esse prazo foi alterado para 15 de Novembro de 2011). O Novo kindle mais leve e a versão sem teclado já está disponível.


Review

O Kindle é realmente um aparelho que impressiona ao observar seu papel eletrônico (e-paper ou e-ink), quanto mais luz melhor. Esse é um ponto bom e ruim, pois não é possível ler no escuro, mas a impressão é que estamos mesmo lendo um livro.

Se você quer um aparelho em que o foco é a leitura, o Novo Kindle é perfeito. O teclado da 3ª geração somente faz falta ao tentar navegar na internet ou na primeira vez que o ligamos e temos que digitar nossos dados para registro. Ainda é possível enviar seus documentos pessoais e receber via wi-fi no Kindle.

Quando nos registramos na Amazon através do Kindle recebemos um e-mail para onde podemos enviar documentos (inclusive PDF) e receber convertidos no Kindle. Todos os jornais possuem um período de 14 dias de teste, e achei muito melhor receber um jornal todo dia pela manhã em um dispositivo portátil do que em papel que serve muito para a desorganização. É uma pena que são poucos editores que aderiram ao formato digital.

Existem muitos livros em Português, além disso é possível baixar PDFs do site Domínio Público e enviar para o seu e-mail do Kindle e receber o livro convertido.

Basicamente é isso, recomendo o Kindle para leitura, é perfeito. Ao invés de possuir uma pilha de livros que ocupa bastante espaço, você pode ter milhares de livros em um dispositivo fino, bonito e portátil. Qualquer dúvida, se estiver pensando em comprar um, só enviar um comentário com sua dúvida.

quinta-feira, 22 de setembro de 2011

Como configurar o retorno automático do PagSeguro em dois ou mais sites

Se você chegou à essa página através de algum motor de busca deve estar a procura de uma solução para um problema comum, com a versão 1 da API do PagSeguro.

Nessa API somente podemos ter configurado uma url de retorno do PagSeguro. Basicamente funciona bem, mas se tivermos dois sistemas distintos que efetuam as operações em bancos de dados diferentes, teremos um problema.

Para resolver essa solução temos que utilizar um critério de diferenciação de cada um dos sites. Acho interessante utilizar o campo “VendedorEmail”, você pode ter diversos e-mails cadastrados no PagSeguro, ao enviar o cliente via POST para a página de pagamento do PagSeguro, você envia o email do vendedor, no campo “email”.

Inicialmente achei que estava incorreto e acabei fazendo a diferença pela Referência, já que a referência era sempre o número do pedido, coloquei um “c_” para um site e assim por diante, no início da referência. E funciona bem.

Com PHP podemos fazer um redirecionamento temporário que reenvia os dados via POST, mas utilizar essa opção me fez perder muito tempo. Acontece que utilizando a biblioteca curl do PHP (que o PagSeguro utiliza para enviar o POST para a url de retorno) por algum motivo esse redirecionamento temporário não acontece, logo não funciona.

Então ao invés de fazer um redirecionamento temporário, utilizo curl para enviar os dados à página correta. Para exemplificar:

if (count($_POST) > 0) {
    if (strpos($_POST['Referencia'], 'c_') !== false) {
        $url = "http://www.site1.com.br/retorno_pagseguro.php";
    } else {
        $url = "http://www.site2.com.br/pagseguro/PagSeguroRetorno.php";
    }
    $ch = curl_init();
   
    $fields_string = '';
    $count = 0;
    foreach ($_POST as $key=>$item) {
        if ($count > 0)
            $fields_string .= '&';
        $fields_string .= $key . '=' . $item;
        $count++;
    }
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_POST, count($_POST));
    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

    $result = curl_exec($ch);

    curl_close($ch);
   
} else {
    header("Location: http://www.site.com.br/mensagem-de-conclusao");
}
?>

Esse é o código que nos interessa, como expliquei acima, prefixei a referência com “c_”, então verifico se existe essa string no campo Referencia, utilizando a função strpos que retorna false, caso o segundo parâmetro string não esteja dentro do primeiro parâmetro string. Então se ele estiver eu defino que a url a ser enviado o POST é a url do primeiro sistema (a ordem não importa), podem ser informadas quantas páginas forem necessários, quantos sistemas você necessitar utilizar na mesma conta.

A última url é a url a qual o usuário será redirecionado quando voltar ao site, essa página deve ser única para todos os sistemas, pois nenhum dado de GET ou POST é enviado.

Com curl enviamos o POST, percorro o array $_POST para formatar a string que é necessária para definir o cabeçalho de envio e por fim chamo a função curl_exec que irá enviar o POST.

Dessa forma, você pode adaptar sua lógica com qualquer sistema.

Se tiver dúvidas ou precisar de ajuda para algum problema específico só enviar a dúvida nos comentários.