Usando os comandos do Symfony2 isolados

Um componente muito útil do Symfony2 é o Console. Ele permite a criação de comandos que podem ser executados via terminal. Isso é muito útil para processos relacionados à manutenção do sistema e àqueles que devem estar na crontab, por exemplo. Assim como os demais componentes do framework, o Console pode ser usado isolado e isso é muito interessante para quando é necessário fazer uma aplicação que deve ser executada via linha de comando.

Para facilitar a criação de um aplicação baseada nesse componente, criei um projeto base no GitHub: https://github.com/straube/base-command. No README existem algumas instruções de como executar e customizar o código, mas ele basicamente adiciona, além do próprio Console, o registro automático de comandos dentro de um namespace específico através do componente Finder, também do Symfony2.

Comunicação entre PHP e Arduino via USB

Fazem uns 6 meses desde que tive meu primeiro contato com o Arduino, desde então eu sempre tive curiosidade de como seria fazer ele “conversar” com um script em PHP. Hoje, finalmente, eu botei a mão na massa e, depois de algumas pesquisas no Google, fiz algumas experiências de comunicação básica. A seguir deixo os dois experimentos que fiz.

Detalhe para a variável $ttyPath usada nos dois exemplos que contém o caminho do dispositivo, no meu caso, no Mac. No Linux e outros Unixes(-like) esse caminho deve ser algo parecido, é o mesmo caminho que aparece na IDE do Arduino. Não cheguei a testar no Windows, mas acredito que não seja complicado encontrar algum exemplo no Google.

Não vou explicar todo o código porque acredito que o próprio código e os comentários já dão uma boa noção do funcionamento, mas caso tenha qualquer dúvida, fique a vontade para usar o espaço para comentários.

Do Arduino para o script PHP

O primeiro experimento consiste em ler o que o Arduino escreve na porta serial.

to_php.cpp

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println('Hello!');
  delay(1000);
}

Esse script PHP basicamente escreve na saída padrão o conteúdo enviado pelo Arduino.

conn_a.php

<?php
$ttyPath = '/dev/tty.usbmodem1a21';
$ttyHandler = fopen($ttyPath, 'r'); // Abrindo a conexão serial
while (true) { // Loop infinto, para testarmos a leitura como acontece no Serial Monitor
  $bytes = fread($ttyHandler, 1024); // Lendo uma linha da conexão, até 1024 bytes
  if (strlen($bytes) > 0) { // Se o Arduino enviou algo ...
    echo $bytes; // Imprimimos
  }
}
fclose($ttyHandler); // Fechando a conexão. De fato, o script nunca vai chegar aqui

Do script PHP para o Arduino

O segundo experimento faz o caminho inverso, de comunicação, do primeiro: envia a quantidade de vezes que o LED deve piscar.

from_php.cpp

int ledPin = 13; // Porta do LED embutido no Arduino UNO
int times = 0; // Por padrão, não deve piscar nenhuma vez

void setup()
{
  Serial.begin(9600); // Iniciando a porta serial
  pinMode(ledPin, OUTPUT); // Iniciando a porta do LED
}

void loop()
{
  if (Serial.available() > 0) { // Se a porta estiver disponível ...
    times = Serial.read() - '0'; // Lemos o conteúdo recebido como inteiro
    if (times < 0 || times > 9) { // Validando o valor lido
      times = 0;
    }
  }
  while (times > 0) { // Piscando até que o número de "piscadas" faltantes seja zerado
    digitalWrite(ledPin, HIGH); // Acende ...
    delay(500); // Espera 1/2 segundo
    digitalWrite(ledPin, LOW); // Apaga ...
    delay(500); // Espera 1/2 segundo
    times--; // Diminui uma "piscada"
  }
}

Nesse script PHP vamos passar o número de “piscadas” do LED como parâmetro. Por padrão, sempre que um script PHP é executado diretamente pelo cliente o primeiro argumento ($argv[0]) é o nome do próprio script ('conn_b.php', por exemplo), sendo assim precisamos capturar o segundo argumento para identificar o número de “piscadas”.

conn_b.php

<?php
$ttyPath = '/dev/tty.usbmodem1a21';
if (count($argv) < 2) { // Esperamos que o número de "piscadas" seja passado como parâmetro
  exit(1);
}
$blinkTimes = (int) $argv[1]; // Lendo o parâmetro com a quantidade de "piscadas"
$ttyHandler = fopen($ttyPath, 'r+'); // Abrindo a conexão serial
fwrite($ttyHandler, (string) $blinkTimes); // Escrevendo a quantidade na conexão
fclose($ttyHandler); // Fechando a conexão

Exemplo de execução (com o Arduino conectado à porta USB):

$ php conn_b.php 5

UPDATE: Infelizmente, notei que esse modelo de comunicação, funciona apenas se o Serial Monitor da IDE do Arduino estiver aberta. Isso acontece porque é necessário abrir a conexão COM e na velocidade correta – normalmente 9600 baud. Assim que conseguir uma solução independente da IDE, atualizo os scripts.

UPDATE 2: O Paulo Trentin colocou um link nos comentários para um artigo que ele escreveu. Eu ainda não tive oportunidade de testar, mas a princípio ele teria resolvido essa questão da comunicação com o hardware exigir a IDE do Arduino aberta durante a execução: http://www.paulotrentin.com.br/eletronica/controlando-arduino-com-php-via-serial/

Referências:

Solução : WordPress e imagens com acentuação no Safari

Já vi esse problema acontecer mais de uma vez e acredito que não tenha encontrado uma solução — ou até mesmo algum relato parecido — porque no inglês (idioma largamente usado com o WordPress) não existe acentuação. Mas nos países que falam Português (ou qualquer outro idioma que possua acentos), um usuário ou outro acaba usando acentuação em nomes de arquivo. Ao fazer o upload de um arquivo desses e usar uma função como a wp_get_attachment_image para exibir a imagem, ela não é carregada no Safari (ao menos no Mac OS X). Ainda não consegui descobrir o motivo exato, pois em outros navegadores funciona como esperado.

Enfim, a solução é bem simples e baseia-se em um filtro.

add_filter('wp_get_attachment_image_attributes', 'ck_image_attrs');

function ck_image_attrs($attrs)
{
  foreach ($attrs as $name => $value)
  {
    if ('src' != $name)
    {
      break;
    }
    $attrs[$name] = ck_fix_image_url($value);
  }
  return $attrs;
}

function ck_fix_image_url($url)
{
  $parts = parse_url($url);
  $path = explode('/', $parts['path']);
  $path = array_map('rawurlencode', $path);
  $path = implode('/', $path);
  return str_replace($parts['path'], $path, $url);
}

Separei a lógica na função ck_fix_image_url para que possa ser usada em conjunto com a wp_get_attachment_image_src, por exemplo.

Running Magento on Mac OS X

I recently formatted my MacBook and I chose to use PHP that comes with the operating system. This version comes with a few libraries installed, then you need to make some customizations.

First you must enable the PHP module in Apache, there are several tutorials talking about it on the web. A quick Google search brings some good results over this. So I will not talk about it here.

Once installed the PHP module in Apache and properly configured, you must compile some libraries from source.

First of all, you should make sure that you have Developer Tools installed. These software usually comes at an additional installation disc, along with your computer.

MySQL should be installed too. You can grab its installer from the official site.
Continue reading “Running Magento on Mac OS X”

Mac OS X and Java 1.6, keyboard input

Few months ago, after I updated (via Apple’s software update) my Java from 1.5 to 1.6, some applications started to have a strange behavior: the input by keyboard simply didn’t work as expected. Some keys, like return and shift, does work, but all letters and numbers not.

Only in the past week I’ve discovered why. The problem wasn’t with the Java version, like I thought, but with the keyboard layout. As I’m brazilian, I’m using the US International layout by Rainer Brockerhoff. Googling about this issue, I found that some custom keyboard layout doesn’t work correctly with recent Java versions.

Now I’m using the Mac’s native layout for Brazil. The bad thing is that I have to make the accentuation using option + some key. e.g., option + e to make the acute accent (´).