Como instalar o WhatsApp em um tablet com Android sem a função de telefone

Os passos abaixo foram executados num Samsung Galaxy Tab 10.1 GT-P7500 3G Wi-Fi com Android 4.0.4. Apesar deste tablet ter entrada para um SIM Card, no chip que tenho nele está habilitado apenas plano de dados, não é possível fazer/receber ligações ou mandar SMS.

Por padrão, o Android não permite a instalação de aplicativos por fora da Play Store. Para que os passos abaixo sejam possíveis, vá em  “Configurações” e, em “Segurança”, marque a opção “Fontes desconhecidas”. Um aviso sobre problemas de segurança é exibido. Como o download será feito direto no site do WhatsApp, vamos confiar e clicar em “OK” 😉 (Após a conclusão da instalação, você pode desmarcar esta opção para aumentar a segurança):

Screenshot_2015-01-29-19-18-10Screenshot_2015-01-29-19-20-02

Faça o download do APK do Whatsapp aqui. Quando terminar, vá em downloads e clique sobre o apk:

Screenshot_2015-01-29-19-16-32

Escolha “Instalador de pacotes” e siga os passos abaixo:

Screenshot_2015-01-29-19-16-44Screenshot_2015-01-29-19-21-21Screenshot_2015-01-29-19-21-51Screenshot_2015-01-29-19-22-12Screenshot_2015-01-29-19-22-55

Na tela abaixo, informe normalmente o número do seu telefone, com DDD, mesmo que o chip do número não esteja no tablet. Nos passos que realizei, informei o número de um celular que tenho (que não é smartphone), que nunca foi associado à uma conta do WhatsApp. Deixem um comentário se funcionar de outras formas 😀

Screenshot_2015-01-29-19-23-34Screenshot_2015-01-29-19-24-12

É importante que o número informado esteja em funcionamento, pois, após informar o número e clicar em “OK”, você receberá um SMS com um código e um link, que é o que interessa nesse passo a passo:

IMG_20150129_212256

No tablet, sem fechar a tela de instalação do WhatsApp, abra o navegador e digite o link recebido no SMS:

Screenshot_2015-01-29-19-26-24

A tela de instalação irá voltar no passo após a autenticação:

Screenshot_2015-01-29-19-27-09

Aqui demora bastante:

Screenshot_2015-01-29-19-27-26

E finalmente:

Screenshot_2015-01-29-19-31-53

 

Deixem nos comentários as experiências de vocês 😀

 

Instalando o mssql e o pdo_dblib no CentOS com WHM para se conectar a um servidor MS SQL Server externo

Comecei a escrever este post em Janeiro de 2013, apenas com anotações rápidas enquanto fazia o procedimento, para mais tarde, reescrever em definitivo. Dois anos se passaram e o post ficou no limbo. Como estou retomando o projeto do blog, resolvi publica-lo, como um rascunho mesmo, afim de ajudar quem estiver procurando estes passos.

Obs: Caso alguém precise das dicas abaixo, e quiser o auxílio de quem já passou por isso, basta entrar em contato, que faremos juntos. Para mim será uma ótima oportunidade de atualizar e passar o texto abaixo a limpo 😉

Segue rascunho:

Esta dica é para quem precisa fazer o PHP se conectar a um banco de dados MS SQL Server remoto a partir de um servidor CentOS com WHM/cPanel. Para executar os passos abaixo, você precisa ter acesso root à máquina, portanto você precisa ter um plano tipo VPS, Dedicado, Cloud, etc. No momento deste procedimento, a versão do meu WHM era a 11.32.3 e o CentOS, 5.8 x86_64.

O primeiro passo é instalar o FreeTDS, e aqui tem um detalhe: a versão mais recente, no momento em que escrevo este post, é a 0.91 porém não tive muita sorte com esta versão, por isto estou usando a 0.82. O FreeTDS é uma biblioteca livre para o protocolo de comunicação cliente-servidor do MS SQL Server e permite a conexão a partir de uma máquina com GNU/Linux.

Baixando e compilando o FreeTDS:

# wget ftp://ftp.freetds.org/pub/freetds/old/0.82/freetds-0.82.tar.gz
# tar -zxvf freetds-0.82.tar.gz
# cd freetds-0.82/
# ./configure –prefix=/usr/local/freetds –with-tdsver=8.0 –enable-msdblib –enable-dbmfix –with-gnu-ld
# make
# make install
# cd /usr/local/freetds/
# ln -s /usr/local/freetds/lib lib64

Agora, vamos recompilar o PHP usando o EasyApache. Ainda no terminal, digite:

# echo “–with-mssql=/usr/local/freetds” >> /var/cpanel/easy/apache/rawopts/all_php5

– Ir ao WHM e recompilar o php com EasyApache
– Em Exhaustive Options List, marcar o PDO
– Para mssql basta

PDO
Fatal error: Uncaught exception ‘PDOException’ with message ‘could not find driver’ in …

# pecl install pdo_dblib
pear/PDO_DBLIB requires PHP extension “pdo” (version >= 1.0)
No valid packages found
install failed

# pecl install -n pdo_dblib
warning: pear/PDO_DBLIB requires PHP extension “pdo” (version >= 1.0)
downloading PDO_DBLIB-1.0.tgz …
Starting to download PDO_DBLIB-1.0.tgz (8,184 bytes)
…..done: 8,184 bytes
6 source files, building
running: phpize
Cannot find config.m4.
Make sure that you run ‘/usr/local/bin/phpize’ in the top level source directory of the module

ERROR: `phpize’ failed

# cd /home/cpeasyapache/src/php-5.3.15/ext/pdo_dblib/
# phpize
# ./configure
configure: error: Cannot find FreeTDS in known installation directories
# vi configure

Procure pelo trecho

for i in /usr/local /usr; do
if test -f $i/include/sybdb.h; then
PDO_FREETDS_INSTALLATION_DIR=$i
PDO_FREETDS_INCLUDE_DIR=$i/include
break
elif test -f $i/include/freetds/sybdb.h; then
PDO_FREETDS_INSTALLATION_DIR=$i
PDO_FREETDS_INCLUDE_DIR=$i/include/freetds
break;
fi
done

Trocar a linha

for i in /usr/local /usr; do

Por

for i in /usr/local/freetds /usr; do

# ./configure
# make
# make install
# echo “extension=pdo_dblib.so” >> /usr/local/lib/php.ini
# /scripts/restartsrv_httpd

PRONTO!!!

HTML5: Geolocalização

Com a nova versão do html, é possível acessar a localização geográfica do cliente que acessa uma página. A origem (fonte) dessa localização pode ser o IP, RFID, endereço MAC do WiFi ou bluetooth, IDs de células GSM/CDMA ou, a forma mais precisa, GPS de um smartphone ou tablet. E é bem simples! Vamos para a prática:

Você pode verificar se o browser do cliente tem suporte a geolocalização com o if:

if (navigator.geolocation) {
    // Tem suporte
} else {
    // Não tem suporte
}

Para fazer a leitura das coordenadas e outros dados:

// Se conseguir fazer a leitura, chama a função posicao(). Se não conseguir, chama a função erro()
navigator.geolocation.getCurrentPosition(posicao, erro);

// Função chamada quando navigator.geolocation.getCurrentPosition CONSEGUE fazer a leitura
function posicao(dados) {
    lat = dados.coords.latitude;            // Latitude
    lon = dados.coords.longitude;           // Longitude
    pre = dados.coords.accuracy;            // Precisão em metros
    alt = dados.coords.altitude;            // Altitude em metros
    preAlt = dados.coords.altitudeAccuracy; // Precisão da altitude em metros
    dir = dados.coords.heading;             // Direção em graus: 0º Norte (geográfico), 90º Leste, 180º Sul, 270º Oeste.
    vel = dados.coords.speed;               // Velocidade em m/s
}

// Função chamada quando navigator.geolocation.getCurrentPosition NÃO consegue fazer a leitura
function erro(dados) {
    switch (dados.code) {
        case 1: 
            alert('Você negou o acesso à sua localização!');
            break;
        case 2: 
            alert('Não foi possível acessar sua posição!');
            break;
        case 3: 
            alert('Timeout ao tentar pegar sua localização!');
            break;
    }
}

Lembrando que são coordenadas geográficas no formato de graus decimais e não em graus, minutos e segundos. Outra coisa em relação ao formato é que, no lugar de usar N (norte), S (sul), E (leste) e W (oeste), usa-se o sinal – (negativo) para as latitudes ao sul (a baixo) do equador, latitude 0, e as longitudes a oeste (a esquerda) de Greenwich, longitude 0. Pense num plano cartesiano com o Equador como eixo X e Greenwich como eixo Y.

E dá para calcular a distância em linha reta entre dois pontos também! Fica assim:

// Se conseguir fazer a leitura, chama a função posicao(). Se não conseguir, chama a função erro()
navigator.geolocation.getCurrentPosition(posicao, erro);

// Função chamada quando navigator.geolocation.getCurrentPosition CONSEGUE fazer a leitura
function posicao(dados) {

    // Minhas coordenadas
    lat = dados.coords.latitude;
    lon = dados.coords.longitude;

    // Coordenadas de destino (podem ser informadas pelo usuário, ou vir de um banco de dados, etc)
    latD = -14.88378;
    lonD = -40.829145;

    // Calcula a distância em km considerando a curvatura da terra
    distancia = 6371 * Math.acos(Math.cos(Math.PI * (90 - latD) / 180) * Math.cos(Math.PI * (90 - lat) / 180) + Math.sin(Math.PI * (90 - latD) / 180) * Math.sin(Math.PI * (90 - lat) / 180) * Math.cos(Math.PI * (lon - lonD) / 180));

    alert('Distância: ' + distancia + 'km');
}

Lembrando que a distância calculada leva em conta a curvatura da terra.

Agora um exemplo um pouco mais elaborado com as distâncias de onde o cliente estiver para algumas pizzarias de Vitória da Conquista – BA:

<!DOCTYPE html>
<html lang="pt-Br">
    <head>
        <meta charset="utf-8" />
        <title>Geolocalização</title>
    </head>
    <body>

    </body>
</html>

Aqui pode ser visto um exemplo do funcionamento de distâncias com geolocalização do código acima (sem CSS).

 

Usando a câmera do celular como leitor de código de barras numa aplição web

Uma forma de aproveitar a câmera do seu celular para ler códigos de barras numa aplicação web é com o auxílio do Barcode Scanner da ZXing Team. Com o programa instalado no smartphone, basta criar um link html em sua aplicação e o mesmo chama o programa que vai ler o código de barras (ou QR code) e retorna o resultado à sua aplicação.

Ele está disponível para Android, iPhone, Blackberry e para outros aparelhos usando J2ME / JavaME.

Link do Barcode Scanner para Android.

Os testes que fiz foram feitos no Android:

<!DOCTYPE html>
<html lang="pt-Br">
    <head>
        <meta charset="utf-8" />
        <title>Código de Barras</title>
    </head>
    <body>
        <form action="#" method="post">
            Código de barras
            (<a href="http://zxing.appspot.com/scan?ret=http://www.seu-dominio.com.br/seu-arquivo.php?codigo={CODE}">Leitor</a>):
            <input type="text" name="cod" value="<?= $_GET['codigo'] ?>" />
        </form>
    </body>
</html>

Abra a página com o código acima (exemplo aqui) num smartphone com Android e clique em (Leitor). Se você não tiver o Barcode Scanner instalado, abrirá uma página em inglês explicando que é preciso instalar o programa para completar a ação e já passa os links para download.

Sem o Barcode Scanner

Depois de instalado, quando você clicar em (leitor) será exibida a tela

Escolha Barcode Scanner

pedindo para escolher uma aplicação para completar a ação. Marque “Usar como padrão esta ação.” e escolha Barcode Scanner para que das próximas vezes ele abra automaticamente, sem perguntas.

Posicione o código de barras

Posicione o código de barras sob a linha vermelha na área mais clara da tela e aguarde a leitura. Quando a mesma é feita, ele retorna automaticamente para sua aplicação com a numeração (ou texto) do código na url. No nosso exemplo a numeração foi colocada num campo de formulário.

Código dentro do formulário

Durante os testes no Nexus One, Nexus S e no Milestone 2 o código de barras foi interpretado rapidamente. Com o Galaxy 5 houve dificuldade de se fazer a leitura, provavelmente por causa da resolução da câmera. Quem puder testar em outros aparelhos, coloque nos comentários sua impressão.

 

Newsletter no Magento 1.4.2.0

Ao configurar o Magento para um cliente, cheguei na parte de newsletter e penei pra botar o bicho pra funcionar. Compartilho aqui a solução que encontrei junto com Marcelo Aires (@mavcomputer) com vocês:

Tentando colocar uma news na fila para ser enviada, quando clicava em ‘Save Newsletter’ nada acontecia. Ao analisar a página com o Firebug no Firefox, o mesmo mostrava que, logo que a página era carregada, no arquivo prototype.js, na linha 4021, a variável element tinha valor null e, ao clicar em ‘Save Newsletter’, que queueControl não havia sido definido, sem dizer em qual arquivo:

Erro no Firebug

Erro no Firebug

O erro do prototype, que é um framework javascript, não interfere no funcionamento da news, então vamos deixá-lo de lado.
O erro do queueControl undefined pode ser corrigido no arquivo

diretório_do_magento/app/design/adminhtml/default/default/template/newsletter/queue/edit.phtml

que, na parte do javascript, tem o seguinte conteúdo:


Como podemos observar, na linha 68 a função switchStore é chamada e a mesma usa queueControl (linha 73), que só é definida na linha 82. A solução é mover a linha 68, que é onde toda a ação é executada, para o final do arquivo, ficando assim (pode ser necessário limpar o cache do Magento após esta ação):


Bom, agora já se consegue enviar a news para a fila. Mas aí vem outro problema… a news fica eternamente na fila, com status Not Sent, e não é enviada nunca!
A solução dessa vez foi adicionar a seguinte linha no crontab do servidor:

*/5 * * * * /usr/bin/php5 -f /home/auere/public_html/magento/cron.php

/usr/bin/php5 é o caminho absoluto do php e pode ser obtido com o comando:

which php

/home/auere/public_html/magento/cron.php é o caminho absoluto até o arquivo cron.php do Magento.

Iniciando o Ubuntu com o TeamViewer no system tray

A primeira coisa a ser feita é instalar o TeamViewer que pode ser baixado em http://www.teamviewer.com/pt/download. Se seu desejo é apenas que o TeamViewer inicie com o Ubuntu, vá em ‘Sistema’ – ‘Preferências’ – ‘Aplicativos de sessão’:

Abrindo aplicativos de sessão

Abrindo aplicativos de sessão

Clique em Adicionar e preencha da seguinte forma:

Nome: TeamViewer 6
Comando: /opt/teamviewer/teamviewer/6/bin/teamviewer
Comentário: TeamViewer Remote Control Application

Adicionando o TeamViewer

Adicionando o TeamViewer

Dessa forma, o Teamviewer vai abrir automaticamente após o login no Ubuntu, só que como uma janela aberta na área de trabalho.
Uma forma mais interessante é deixar o TeamViewer no system tray para que ele continue rodando, sem a necessidade de uma janela aberta. Para iniciar o TeamViewer automaticamente no system tray precisaremos do alltray. Para instalá-lo, vá ao terminal e digite:

sudo apt-get install alltray

Então volte aos Aplicativos de sessão, escolha TeamViewer 6 e clique em ‘Editar’. No campo ‘Comando’, adicione /usr/bin/alltray antes do comando já existente ficando assim (atenção ao espaço entre os comandos, depois da palavra alltray):

Comando: /usr/bin/alltray /opt/teamviewer/teamviewer/6/bin/teamviewer

Deixando o TeamViewer no system tray

Deixando o TeamViewer no system tray

Uma dica importante: se estiver acessando uma máquina remota pelo TeamViewer, não houver alguém por perto dessa máquina, e precisar reiniciá-la, deve habilitar a opção de login automático, uma vez que o TeamViewer só inicia após o login no Ubuntu. Para isso vá em ‘Sistema’ – ‘Administração’ – ‘Tela de  login’:

Tela de login

Tela de login

Clique em ‘Desbloquear’ e informe a senha:

Desbloqueando as configurações da tela de login

Desbloqueando as configurações da tela de login

Marque a opção ‘Iniciar sessão automaticamente como’, escolha o usuário e clique em ‘Fechar’:

Iniciar sessão automaticamente como

Iniciar sessão automaticamente como