Instalando React Native no OS X e Xamarin Android Player

Salve,

Vamos aprender como instalar o React Native no OSX e utilizar o Xamarin Android Player para visualizar.

Um dos artigos que me baseei para a instalação do meu ambiente não aborda a parte de desenvolver para android e o o artigo oficial aborda o uso do genymotion ou do AVD. Então ensinarei como instalar e utilizar no lugar dos 2 emuladores o Xamarin Android Player.

Motivos de não usar o AVD: não entendi a documentação para instalar/configurar, não tenho/preciso do Android Studio e a configuração é hiper grande e chata.

Motivos de não usar o Genymotion: não inicia a o emulador/vm de jeito nenhum, mesmo após remover ele e o virtualbox e reinstalar.

Vamos seguir os passos de ambos os artigos mas com algumas adições. Não vou explicar os detalhes que estão em cada artigo. No OS X utilizo o brew para instalar então.

Se não possui o node.js (versão mínima é a 4.0) instalado, faça-o:

 

 

Instale o watchman que vai ajudar no desenvolvimento:

 

 

Instale o react native:

 

 

Eu enfrentei vários problemas nessa parte, não instala. Um era a versão do Node.js, então instalei a mais nova (atualmente), que é a 6. Depois houve problemas com dependências, então fiz:

* Isso mesmo, update 2 vezes.

Após isso, você deve conseguir instalar normalmente o react-native-cli.

Nesse ponto, você já é capaz de rodar no iOS, caso possua o Xcode instalado. Para testar:

Agora vamos por para funcionar o android.

 

Instale o Git, se não possuir:

Instale o JDK e depois o Android SDK:

Configure as variáveis de ambiente no ~/.bashrc ou ~/.zshrc ou ~/.bash_profile :

Configure o gradle e o Android SDK.

Instale o Xamarin Android Player, é só baixar e instalar. Após instalar, inicie-o, escolha o dispositivo (basicamente modelos baseados na linha Nexus) e clique no botão de baixar e instalar. Após instalar, a listagem vai ganhar uma sessão antes da Downloadable chamada Installed e vai listar todos os dispositivos que você instalar.  Agora basta iniciar o dispositivo desejado clicando no ícone de play ou botão de contexto > play.

Agora rode o projeto no android:

Pronto! É tudo reconhecido e vai aparecer no android. Pode demorar um pouco no início, ao menos aqui demora quando há o hot reload, mas não sei como é no emulador oficial ou no genymotion.

Espero ter ajudado.

Usando docker conectando no mysql local (da máquina host) no OSX

Salve,

Levando em consideração que sabe usar o docker, vamos ao problema.

Muitos quando vão migrar para o docker, por diversos motivos, não deseja fazer a migração completa de todos os serviços (servidor web, php, mysql, redis e etc) principalmente a parte de banco de dados, que se já tem dados vai dar mais trabalho para migrar do que os outros serviços. Então a saída é migrar os outros serviços mas manter utilizando/conectando no mysql local ainda, que já está redondo e funcionando perfeitamente, e com o tempo irá pensar numa migração completa.

Estou me baseando na experiência com o docker no OSX.

Você já possui o docker instalado e rodando, então vamos as configurações.

MySQL

Criando usuário e dando permissão para receber conexão de qualquer origem:

No my.cnf mude ou adicione o bind-address:

Reinicie o mysql.

Docker

Se utiliza o docker no OSX ou Windows temos um problema. O docker nesses S.O.’s virtualiza uma distribuição linux e essa sim será a máquina host dos containers, pois o sistema de container só existe no Linux e o docker é criado sobre ele. Caso seja seu caso cheque se ela está ativa:

Veja se lista alguma máquina e na coluna STATE  está Running. Se Não estiver, é preciso definir as variáveis de ambiente:

Continuando…

Agora você terá que entrar no shell de um container:

 

Ao entrar nela (você verá que o terminal muda para algo como “root@algum-hash-qualquer“)

Procure na coluna Destination a linha que tem valor default e agora veja a coluna Gateway da respectiva linha, haverá um IP. Esse é o IP da máquina host para os containers. Que no caso de quem usa OSX ou Windows é equivalente a sua máquina.

Basta utilizar esse IP como o host do seu banco de dados.

Docker for Mac

Se você utiliza o Docker for Mac, que ainda está em beta e precisa de convite para pode baixar e utilizar, é mais simples, basta você executar:

Entre as interfaces, procure por algo assim:

Ai o IP após inet é o IP que precisa utilizar, nesse caso é 192.168.64.1.

Então é isso. Espero ter ajudado.

http://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach

Desabilitando escape de html no label das opções de uma Zend_Form_Element_Radio no ZF1

Salve,

Levando em consideração que sistemas duram muito tempo e nem sempre estão atualizados com as últimas versões dos componentes e frameworks, esse artigo é focado em Zend Framework (aka Zend Framework 1).

Ao necessitar de adicionar código html dentro do valor do <label></label>  das opções de um elemento Zend_Form_Element_Radio, demorei de conseguir e a documentação como sempre foi falha, só achei na comunidade.

O Caso

Tenho uma lista de opções num formulário com Zend_Form utilizando o elemento Zend_Form_Element_Radio, até ai tudo bem, basta um array simples, onde a chave é o valor que deseja está no atributo value do <input type="radio">  e o valor dessa chave, sendo o texto que você deseja que apareça, que fica ao lado do <input type="radio"> , todos dentro de um <label></label> :

Mas um desejo de por um código html, nesse texto, foi solicitado e devemos tentar atender sempre que possível, então deveria ficar assim:

Solução

Adicionamos o código HTML junto ao texto, mas sempre vem escapado, mostrando o código HTML e não a renderização. Se utilizarmos a opção escape do decorator Label, ele escapa o label principal e não das opções. Não adiantando em nada, no nosso caso.

Mas a solução é simples, não totalmente clara, e sem documentação, bastando passa um parâmetro escape com valor false, no array de opções na inicialização do elemento, assim:

Espero ter ajudado!

Fontes:

http://stackoverflow.com/a/2535390/2417962

http://forums.zend.com/viewtopic.php?f=69&t=5938&start=0

Criando extensão do Twig que renderiza html, com e sem template

Salve,

Estava precisando criar uma extensão do Twig, para rodar no Symfony2, que me retornasse o html e o mesmo, não fosse mostrado em código html, mas sim renderizado. Pesquisando achei a solução e é bem fácil.

Passe no array de parâmetros  $options  a chave is_safe com valor  ['html']  no construtor da Twig_Function_Method:

Desse jeito, basta utilizar {{ myTitle('Meu título aqui!') }} e renderizará o código <h1>Meu título aqui!</h1>. Sem isso, seria escapado o html utilizando htmlentities() e seria impresso o código html ao invés de renderizá-lo.

Agora, você poderá querer separar os papéis e jogar o html num template, assim, além de todos os benefícios de organização, seguir boas práticas, vocês poderá customizar a qualquer momento sem nem tocar no código da extensão. Vamos lá!

Faremos 2 mudanças em relação ao código anterior.

A primeira é passando para a Twig_Function_Method via $options que essa função precisa o ambiente do Twig, que é uma instância da classe Twig_Enviroment, através da chave needs_environment com o valor true:

Para não repetir muito código, irei passa somente o método modificado.

A segunda é adicionar ao método myTitle, como primeiro parâmetro sempre, o parâmetro $twig. E daí você poderá chamar o render e passar demais parâmetros e etc para a view:

A view:

Com isso, quando você precisar mudar algo em relação ao html do título, basta mudar a view, e ficar longe do código da extensão, o que diminui a probabilidade de criar bug. E principalmente, fica mais organizado e padronizado.

Espero que ajude!

Forçando HTTPS no Symfony2

Salve,

Em muitos casos, possuímos a necessidade de que as URL’s (rotas) sejam acessadas via HTTPS (SSL) (todo mundo tem medo da NSA :D), sejam todas ou algumas específicas. Então ensinarei como fazer.

Caso você deseje forçar o HTTPS somente em alguma rota específica, tipo login ou cadastro, a maneira mais rápida é fazer via app/config/security.yml:

Mas em casos onde você precisa rodar todo o sistema sobre HTTPS, dessa maneira ai fica bem ruim, além de cansativo. Então vamos mudar no app/config/routing.yml:

Isso diz que todas as rotas desse controller, só serão acessadas via HTTPS, até mesmo usando o path(), ele vai gerar com HTTPS. Lembrando que se você utilizar outro tipo de configuração de rota, a configuração é a mesma.

Então é isso.

Documentação: http://symfony.com/doc/current/cookbook/routing/scheme.html

Intregrando Plupload com Symfony2

Salve,

Necessitando utilizar o Plupload para envio de arquivos em massa em um projeto Symfony2, achei um bundle que faz toda a integração de backend, com suporte a coisas interessantes e de forma simples e fácil de utilizar. Esse bundle é o OneupUploaderBundle.

Para instalar é fácil:

Quando pedir a versão, informe: ~1.3. Ou adicione no composer.json:

Após instalar o pacote, registre o bundle no app/AppKernel.php:

Agora configure ele em app/config/config.yml:

Configure a rota automática em app/config/routing.yml:

Na view que deseja, configure:

Praticamente está funcionando. Ele vai salvar em web/uploads/fotos (fotos é o nome do mapeamento no config.yml). Se quiser realizar tarefas após o upload com cada arquivo, só fazer um listener, onde se recebe dados via parâmetro $event, onde tem acesso ao arquivo via $event->getFile().

Para melhorar e fazer mais coisas, a documentação é boa, com exemplos e tem funcionalidades bacanas: https://github.com/1up-lab/OneupUploaderBundle/blob/master/Resources/doc/index.md

Listener:

Valeu!

 

 

 

Importação de dados em massa, PHP, Doctrine e problemas

Salve,

Estava numa necessidade de importar uma quantidade grande de dados, para algumas pessoas não tão grande, que estava em um CSV. Os dados eram as cidades de todo o planeta e a quantidade de registros é imensa, quase 3milhões de linhas.

O sistema está usando Symfony2 com Doctrine2 e fiz uns comandos para importar países, estados e faltava cidades. Os outros foram beleza, teve certa demora mas não passou de 4mil linhas, com no mínimo 2 consultas ao banco antes de gravar.

Para importar cidades, segui o mesmo padrão: carregar a linha, consulta o estado a partir do código ISO do país + o código da região, se existir, checo se a cidade existe, se não existir, gravava. Mas não deu certo. Fiz ajustes no código para dá insert a cada 200 itens na fila de persistência, depois aumentei e o máximo que consegui foi 200mil registros. Muito, se comparar aos que já tinha feito, mas pouco se comparar ao total que eu tinha que conseguir. Fiz otimizações até chamando função do coletor de lixo do PHP, ajudou, mas não suficiente. Sem elas não passava de 150mil registros.

Até que eu lembrei do Redis, suas diversas estruturas de dados, sua capacidade de salvar cópia em disco e mais outras coisas, sou apaixonado pelo Redis :D.

Mudei a estratégia para fazer funcionar. Pelo fato de que talvez nunca houvesse uma atualização de cidades após essa importação, e tratando para excluir as cidades brasileiras, já que elas já existiam no banco de dados e essa importação tem o objetivo de fazer a aplicação suportar cidades do mundo todo nos seus cadastros. Passei a não checar se o estado e a cidade existiam, descartei o insert na hora, pois pior que trabalhar com milhões de registros num arquivo texto é trabalhar com milhões de consultas ou operações de gravação no banco de dados, é um caos.

Para a solução comecei a por os estados (~4mil) em uma estrutura de Hash, no Redis, com a chave sendo o código iso (ISO do país + código da região) e o valor sendo o ID do estado no banco de dados, usando uma consulta somente, a única envolvida nessa mudança.

Com esses dados no Redis, varri as cidades e gerando um código SQL de insert e guardando numa outra estrutura do Redis, a List, esse código. Com isso em menos de 25 minutos já tinha todas as cidades no Redis, com o código de insert correto, dando um total de 2.884.445 de cidades. Mas ainda tinha um problema, ainda não estava no banco de dados da aplicação, que é um MySQL.

Após ter todos os dados gerados corretamente, bastam 2 comandos: um para exportar os inserts para um arquivo .sql e outro pra importar o .sql no MySQL.

Creio que seja uma ótima solução e que não faz sair totalmente do ambiente PHP e usar outras linguagens, apesar de ainda ter que exportar e importar o arquivo sql, para processamento total. Além de ser bem rápido e simples.

Após perder várias horas tentando fazer um milagre sem sair do ambiente que estava, estou bastante satisfeito com a solução como um todo. E mais apaixonado pelo Redis 😀

 

Symfony2: campo do tipo Entity, no Form type, com o texto do item usando diversas propriedades da entidade

Salve,

Estava com uma necessidade de aparecer num <select> a informação de duas propriedades da entidade utilizada, e achei, não de maneira fácil mas que parece ser uma saída elegante. Supondo que nossa entidade tem dois campos, codigo e nome, e no <option> preciso mostrar essas duas propriedades seguindo o padrão de formatação: $codigo$nome

<Form\MeuFormType.php>

<Entity\MeuTipo.php>

 

Explicando:

Basta criar um método na entidade que retorne uma string, não precisa ter a propriedade do método, pois apesar da configuração se chamar property, ele vai tentar acessar via métodos de acesso get(), has(), is*() e __get().

Fica ai a dica. Espero ter ajudado.

Filtro em coleção no Doctrine

Salve,

As vezes temos uma situação onde precisamos filtrar dados retornado de um relacionamento entre entidades, onde o fruto desse relacionamento é uma coleção de uma das 2 entidades, mais especificamente numa relação One to Many. O Doctrine retorna um ArrayCollection, que é uma estrutura do Doctrine que implementa vários tipos de estruturas do PHP como: Countable, IteratorAggregate e ArrayAccess.

Com isso você pode fazer diversas operações sobre a coleção, mas uma das mais bacanas que faz poupar consultas extras ao banco somente para retornar os dados filtrados como deseja é a matching(Criteria $criteria), que receber uma instância de Doctrine\Common\Collections\Criteria com as suas devidas regras de filtragem.

Um uso que faço é quando tenho nessa coleção registros com um determinado campo que desejo usar como filtro, um exemplo é uma entidade de mídia, onde se tem um campo com o tipo da mídia (vídeo, imagem, slide e etc), e você deseja filtrar essa coleção, que é acessível facilmente pelas mágicas do Doctrine, sem ter que fazer uma consulta manualmente específica para isso, trazendo as mídias que tem um determinado valor naquele ou naqueles campos:

Quando você fizer um $album->getFiles(), irá retornar todas as mídias de todos os tipos. Ai usamos o Criteria no ArrayCollection sobre o matching() para filtrar, adicionando um método simples na entidade Album, por exemplo:

Somente imagens

 Somente vídeos:

Ficando assim a entidade com as mudanças:

Você pode usar o Criteria para criar diversos filtros.

Então fica ai uma ajuda para tentar evitar ficar fazendo diversas consultas e códigos extras e confusos para filtros uma coleção.

Valeu!