sábado, 22 de dezembro de 2012

PHP: Separando textos delimitados com a função explode()

Hoje é uma dica rápida: Suponhamos que o banco de dados retornou uma data. Só que a data é uma string no formato 0000-00-00 (por exemplo, 2012-12-21). Como separá-las para que eu possa mexer com dia, mês e ano separadamente? Utilizamos a função explode() do PHP.

A função explode tem a seguinte sintaxe:

Javascript: Fazendo Javavascript executar um código PHP com XMLHttpRequest

Algo bem útil, uma vez que o Javascript não pode fazer coisas, como conectar ao um banco de dados. Usando o PHP como um intermediário, você pode fazer com que o Javascript consulte um banco de dados sem precisar recarregar a página.

O que precisamos fazer é usar o objeto XMLHttpRequest. Nós já falamos dele uma vez no artigo sobre carregar um arquivo XML, portanto, não vou me prender nos detalhes já ditos:

sexta-feira, 21 de dezembro de 2012

PHP: Conexão e Manipulação de Banco de Dados (MySQL)

Esse é um tutorial muito comum, mas é sempre bom juntar tudo em um lugar somente. Hoje vamos ver como criar e manipular o banco de dados. O Banco de dados que estou usando é o MySQL, que é o mais usado. Vou explicar passo a passo, na ordem em que as coisas tem que ser feita.

1. Conexão
A primeira coisa que deve ser feita é a conexão com o banco de dados. Para isso, precisamos informar ao PHP, as informações sobre o banco. Para isso, usamos a função mysql_connect():

quinta-feira, 20 de dezembro de 2012

GameMaker: Adaptando a tela para dispositivos móveis utilizando View

Esse é o meu novo brinquedo! Uma engine de jogo, que apesar de ser uma das mais simples, satisfaz minhas necessidades. E o melhor dela é o fato de poder unificar o projeto, não necessitando fazer diversos projetos, sendo exclusivo para Android, outra para iOS e outra para Mobile. E ainda posso exportat também para Windows, Mac, HTML5 e Windows 8 e para projetos de brincadeira: Steam Workshop.

Mas com essa versatilidade, chega ao mesmo problema que falei ontem: tamanhos de telas e suas diversificadas resoluções. Então, as dicas que usei no outro post continuam valendo, entretanto, temos outra abordagem que podemos utilizar usando um dos recursos que o GameMaker permite utilizar: as View.

quarta-feira, 19 de dezembro de 2012

iOS, Android: Tamanhos de Tela

Um dos grandes problemas, quando trabalha com telefones celulares comuns (leia-se programar com J2ME) era o tamanho de tela: diversos aparelhos com tamanho de telas totalmente diferentes. Então veio a oportunidade para programar para iOS: Eba!!! Só existe 1 tamanho de tela! O tempo passou e lançaram o iPad. Até aí tudo bem, são só dois tamanhos diferentes.... e o tempo passou e agora temos o iPhone 5 e o iPad Mini.... Fuuuuuuuuuuuuuuuuuuuuuuuuuuuu... basicamente temos 4 telas diferentes para trabalhar, e ainda fora de proporção, como no caso do iPhone 5. Enquanto isso, temos a Google lançando o Android e diferente do iOS, nunca se estabeleceu um padrão de telas com medidas exatas, sendo apenas classificadas como small, normal, large e x-large ou ldpi, mdpi, hdpi e xhdpi.

terça-feira, 18 de dezembro de 2012

Algoritmos de Seleção: Método da Roleta

Falar um pouco sobre métodos de seleção. Basicamente método de seleção é um método utilizado para selecionar ou "sorteiar" alguma coisa e são bastante usados nos algoritmos genéticos, na parte de selecionar os melhores soluções.

Quanto aos algoritmos genéticos, falo outro dia, mas os métodos de seleção pode ser útil em outras áreas, principalmente em jogos. Por exemplo, imagine um jogo de quiz para um jogo educacional. Você quer focar as perguntas em uma só pergunta, mas sempre colocando perguntas algumas perguntas de assuntos passados, para fins de estar sempre relembrando. Ou seja, é um quiz que sorteará as perguntas, mas algumas perguntas tem que ter uma chance maior de aparecer do que as outras. É nesse caso que uso o método da roleta.

segunda-feira, 17 de dezembro de 2012

JavaScript: Estruturas de Repetição

Algo bem básico para os programadores, mas sempre bom estar lembrando: as estruturas de repetições. No Javascript nós temos quatros estruturas:

1. while

O primeiro delas é o while (Enquanto). a estrutura dela. Ela tem a seguinte estrutura.

while( /*uma condição aqui*/ ){
    /* Seu código aqui */

}

domingo, 16 de dezembro de 2012

iOS: Restaurar Transações

Algum tempo atrás trabalhei para aplicar o in-app purchase num aplicativo, entretanto foi uma experiência muito frustrante. Era para eu ter escrito aqui, mas os projetos ficaram tão atrasado nesse caso que nem tive tempo de documentar aqui no blog essa experiência. Enfim, precisei retomar o código do in-App Purchase devido a uma exigência da Apple: tem que haver um botão para restaurar todas as compras de uma só vez. 

Como era de se esperar, pouca documentação decente sobre isso, mas consegui fazer. Vamos então ao procedimento:

Primeiro vamos programar a função do botão que vai ativar o processo:

-(IBAction)restaurarInAppPurchase:(id)sender{

}

sábado, 15 de dezembro de 2012

HTML5: Armazenamento Persistente de Dados

Com o HTML5 podendo fazer sites e aplicativos mais complexos, é natural que precise armazenar os dados . A ideia é semelhante aos Cookies e Sessões, mas com a diferença é que esses dados não expiram e também são armazenadas no cliente, sem precisar de comunicação com o servidor.

Bem, assim como temos cookies e sessões, o HTML5 suporta as duas formas:
  • sessionStorage: os dados são armazenados até que a página seja fechada;
  • localStorage: os dados são armazenados indefinidamente, mesmo que feche a janela, desliga o computador e jogue na fogueira (menos, por favor). 
Ambos utilizam um sistema de pares com chaves, ou seja, associo um valor para uma palavra-chave. Para inserir o valor, utilizamos o método setItem. Vejamos o exemplo:

sessionStorage.setItem("minhaChave","Meu Valor");
localStorage.setItem("minhaChave2","Meu Valor 2");

Neste caso, se eu fechar a aba da página, o valor de "minhaChave" não vai existir, mas o valor de "minhaChave2" vai continuar armazenado. Outra coisa importante é que os valores armazenados são strings. Se você for armazenar números, por exemplo, vai precisar fazer a conversão de String para um tipo numérico.

Agora, para recuperar o valor, utilizamos o getItem:

var valor1 = sessionStorage.getItem("minhaChave");
var valor2 = localStorage.getItem("minhaChave2");

 Bem, já vimos para guardar e para recuperar, mas lembra que disse que, no caso do localStorage, os dados ficarão armazenados por tempo indefinido. Então se preciso apagar os valores, tem como? Tem até dois modos! Usamos os métodos removeItem para remover um item específico e o clear para limpar todos os dados:

sessionStorage.removeItem("minhaChave");
localStorage.clear();

Então pessoal, antes de fechar, só lembrando que as únicas páginas que podem acessar esses valores são aquelas do mesmo domínio. Durante a pesquisa, vi que alguns relatam que só do fato da página estiver em subdomínio diferente, os dados armazenados já não podem mais ser acessados.

Então até mais pessoal.

Javascript: Temporizador

As vezes, queremos que um certo algoritmo seja executado em intervalos de segundos, como um relógio virtual. Ou então queremos que o algoritmo espere um determinado tempo para dar alguma resposta para o usuário. Esses dois casos podem ser resolvidos usando um temporizador.

No Javascript tem dois tipos de temporizadores. O primeiro é o setInterval, que executa uma função a cada intervalo de tempo. Ele leva dois parâmetros: a função que queremos que seja executada e o segundo parâmetro, o intervalo de tempo em milisegundos. Vamos olhar um exemplo:

quinta-feira, 13 de dezembro de 2012

HTML5: Tamanho do Texto no Canvas

Mais um artigo sobre Canvas e Texto. O caso de hoje é bem interessante: Digamos que eu esteja criando um botão para usar no Canvas, e na aparência do botão, quero que tenha um rótulo. Mas eu quero que o botão se adapte ao tamanho do texto que vou inserir. Como faço isso? Para nossa alegria, o contexto possui um método para fazer essa medida, o método measureText
Sempre que for usar esse método, faça depois de configurar a fonte, conforme o código embaixo:

ctx.font = "30px Arial";
var tam = ctx.measureText("Olááá Enfermeiraaa");
ctx.strokeRect(10, 10, tam.width, 30);

Esse código cria um retângulo que é capaz de envolver o texto que eu quero. O método measureText retorna um objeto que possui a largura (atributo width) do texto. Sim, somente a largura, pois a altura do texto é definida pela fonte, que neste caso é 30.

Então pessoal, espero que esse tutorial rápido possa ser útil.

quarta-feira, 12 de dezembro de 2012

HTML5: Alinhamento de Texto no Canvas

Já vimos uma vez que podemos inserir textos em uma Canvas, mas eu só mostrei como mudar a fonte e como usar os métodos fillText e strokeText. Mas suponhamos que você queira que o seu texto fique exatamente no centro da Canvas, como faria isso?

Isso não é complicado. Podemos alterar a linha base do texto para deixar no meio. Então, a posição y que indicamos nos métodos fillText ou strokeText vai estar indicando o meio da imagem quanto a posição vertical.

terça-feira, 11 de dezembro de 2012

HTML5: Criando Elementos Clicáveis no Canvas

Uma das grandes problemas de quem está começando a fazer jogos no HTML5. Para fins de navegador, Canvas é como uma imagem qualquer, e qualquer coisa que é desenhada nessa imagem, vira parte da mesma. Agora, a grande pergunta: como é que vou clicar naquele botão que coloquei no Canvas, se ele é apenas um monte de pixels?

Aí entra a importância de criarmos objetos para descrever o que queremos. Vamos supor que queremos um botão retangular. Para isso, vamos criar uma classe para descrever esse botão:

function Botao(x,y,w,h){
   this.x = x;
   this.y = y;
   this.w = w;
   this.h = h;
}

segunda-feira, 10 de dezembro de 2012

Javascript: Javascript e a tag Body

Hoje vou explicar a relação entre o elemento <Body> do HTML e o Javascript. Já aconteceu algumas vezes de eu tentar manipular elementos do <body> antes do mesmo estar carregado, uma vez que a maioria das vezes que insiro um Javascript, ele geralmente é inserido no <head>

Inserir no <head> é aconselhável para funções, pois os mesmos tem que estar carregado antes do usuário poder mexer. Entretanto, na hora do teste esquecemos que o script ocorre logo que o navegador faz o download, então ocorre o erro. 

domingo, 9 de dezembro de 2012

Javascript: Problemas com Atributos de um Classe

Um problema que demorei, mas foi bem simples de resolver. O caso é o seguinte: criei uma classe no Javascript, como exemplo abaixo:

function minhaClasse(a,b){
   this.a = a;
   this.b = b;
   this.c = 0;

 
   function calculaC(){

   }
   
   obj.onload = calculaC;
   obj.src = "oi.html"

}

HTML5/Javascript: Importando outro arquivo JS por Script

A maioria das linguagens de programações permite que você crie scripts ou código fontes em arquivos separados e com uma só palavra, você pode importar esse código externo para o seu código. E havendo uma grande vantagem que é você poder alterar em um lugar e todos os outros códigos que o utilizam é alterado também. 

Entretanto, Javascript não tem essa funcionalidade por padrão, o que complica essa versatilidade. Então pesquisei e descobri uma forma de implementar essa funcionalidade. Vamos para o código:


function include(file_path, feedback){
    var j = document.createElement("script");
    j.type = "text/javascript";

    j.async = true;
    j.onload = feedback;
    j.src = file_path;
    document.head.appendChild(j);
}


sábado, 8 de dezembro de 2012

Javascript: Carregando e Usando Arquivos XML

1. Carregando um Arquivo XML

Para carregar um arquivo XML é simples, basta utilizar um objeto XMLHttpRequest e isso facilitará seu trabalho. Veja o código abaixo:

function xmlLoader(url){
  var Loader = new XMLHttpRequest(); 

  Loader.open("GET", url, false);
  Loader.send();
  return Loader.responseXML;
}

sexta-feira, 7 de dezembro de 2012

Javascript: Criando um Objeto Anônimo

Objetos anônimos são objetos que não são definidos formalmente com uma classe e geralmente são criados on-the-fly. A grande vantagem de utilizar um objeto anônimo é a agilidade de criar uma estrutura e já inserindo valores nela. Por exemplo, vamos dizer que quero criar um objeto que cadastre uma pessoa, podemos simplesmente criar uma estrutura assim:

quinta-feira, 6 de dezembro de 2012

Javascript: Array

Vetores sempre deixam a programação muito mais prática, mas quando você sabe tudo o que pode fazer com um vetor numa linguagem de programação fica muito mais prática ainda. Então vou deixar aqui um material de referência para as operações básicas de Array do Javascript, então tire bons proveitos deles:

Propriedades:
  •  length: indica a quantidade de elementos que o vetor possui;

terça-feira, 4 de dezembro de 2012

HTML5: Usando o Canvas


1. Conhecendo a Tag <Canvas>
Hoje comecei meus estudos para desenvolvimento de jogos em HTML5. A primeira coisa que aprende é a tag Canvas, que é onde o jogo vai ser desenhado. Vamos pegar um exemplo de código:

<!DOCTYPE HTML>
<html>
    <body>
        <canvas id="game" width=800 height=600>
            Seu navegador não suporta HTML 5
        </canvas>
    </body>

</html>


segunda-feira, 3 de dezembro de 2012

HTML5: Definindo a Codificação da Página

Bem, para deixar contextualizado o motivo dessa pesquisa: estou criando um jogo para me ajudar a decorar os caracteres japonês e estou fazendo esse jogo em HTML5. Obviamente, chegaria a esse ponto que preciso deixar claro para o navegador que eu vou precisar usar caracter japonês através de alguma tag, para que eu não precise ficar toda hora modificando a codificação pelo navegador.

Para fazer isso em HTML 5 é simples, basta inserir o seguinte código entre as tags <head>:

<meta charset = "shift-jis" />


Esse código indica para o navegador para usar a codificação Shift-Jis, a codificação que permite visualisar caracteres japonêses. No lugar do Shift-Jis, poderia estar UTF-8 ou qualquer outra codificação.

domingo, 2 de dezembro de 2012

PHP: Manipulação de Arquivo ZIP

Hoje vamos aprender a manipular arquivos ZIP, compactando ou descompactando arquivos em tempo de execução.

1. Abrindo/Criando um arquivo ZIP
Para começar a utilizar o arquivo ZIP vamos instanciar um objeto ZipArchive:

$zip = new ZipArchive();

Aqui instanciamos um objeto ZipArchive na variável $zip. Agora nós vamos abrir o arquivo, semelhante o que fizemos no artigo Manipulação de Arquivos:

Experiências: Política da Apple e programação para iOS

Esse é um artigo para relatar experiências que tive, mas que não se encaixa em um lado totalmente técnico. Neste caso, vou contar duas experiências ruins envolvendo a Apple.

A primeira é a obsolescência planejada da Apple, em apenas dois anos, tenho que, além de pagar os U$99,00 anuais, ter que gastar em atualização de Sistema Operacional para poder receber as novas versões do XCode. Se não fazer a atualização, você não consegue atualizar e para piorar, os novos aparelhos da Apple não tem compatibilidade com a antiga arquitetura disponibilizada. E o mesmo vale para o aparelho de teste, que em dois anos já, porque as novas versões do XCode não tem suporte para a arquitetura antiga. Enfim, se quer distribuir para a Apple, vai ter que desembolsar bastante para a mesma, e se não fizer, é capaz de ficar um bom tempo até descobrir o porquê do seu aplicativo funcionar nos aparelhos antigos, mas não funcionar nos novos.

sábado, 1 de dezembro de 2012

Algoritmo: Merge Sort

Assim como o Quick Sort, o Merge Sort também utiliza a estratégia dividir para conquistar. Entretanto, a estratégia do Merge Sort é dividir o vetor em vários subvetores já no início e ordenar enquanto reconstrói o vetor. 

Esse método possui duas funções,  a que faz as divisões (neste caso, a função MergeSort()) e a função que a reconstrói (a função Merge()).
A função que faz a divisão, faz de modo recursivo, sempre dividindo o vetor ao meio até que não seja possível dividí-lo. 

Depois de dividido, utiliza-se a função de união que irá pegar os dois vetores e unirá ambos vetores, já ordenando seus elementos. E assim vai reconstruindo até que todos os elementos estejam unidos novamente. Veja o psudocódigo abaixo:

sexta-feira, 30 de novembro de 2012

Algoritmo: Quick Sort

O Quick Sort, como o nome já diz, é um dos algoritmos de ordenação mais rápidas já desenvolvida. Utiliza uma estratégia de dividir para conquistar e consiste em pegar um elemento pivô e mover todos os elementos maiores que o pivô para um lado e todos os elementos menores para o outro (o qual lado depende se for crescente ou decrescente). 

Uma das razões dele ser rápido é porque a análise começa das duas pontas e vai em direção ao centro, onde geralmente está localizado o elemento pivô. Depois de analisar e mover todos os elementos em relação ao pivô, então divide-se o vetor em duas partes e aplica a mesma técnica nos dois subvetores, até que não seja possível dividir os vetores. 

quinta-feira, 29 de novembro de 2012

Algoritmo: Selection Sort

Continuando a série sobre algoritmos de ordenação, hoje falarei sobre o Selection Sort.

O Selection Sort funciona de forma semelhante ao Bubble Sort. A principal diferença é durante a análise de qual número vai naquela casa, não é feito a troca imediatamente, mas sim guardado a referência para aquela posição (no pseudo-código abaixo, essa referência é guardada na variável “menor”). 

segunda-feira, 19 de novembro de 2012

Algoritmo: Bubble Sort

Vou iniciar uma série sobre algoritmos de ordenação, começando hoje pelo Bubble Sort, também conhecido como o método da bolha. Para facilitar, vamos pegar o seguinte caso: tenho um vetor de  inteiros chamado vet com os seguintes valores: {55, 76, 26, 64, 26, 80, 71, 46} e temos que organizar os números desse vetor em ordem crescente.

Vamos para o pseudocódigo:

01. var x,y,aux : INTEIRO   
02. PARA x=0 ATE vet.tamanho PASSO 1
03.     PARA y=x+1 ATE vet.tamanho PASSO 1
04.      SE(vet[x] > vet[y]) ENTAO
05.       var aux = vet[x]
06.       vet[x] = vet[y]
07.       vet[y] = aux
08.      FIMSE
09.     FIMPARA
10.    FIMPARA

Vamos para a explicação:

quinta-feira, 1 de novembro de 2012

Javascript: Criação de Objetos

Para criar um objeto em Javascript, é necessário apenas declarar o seu construtor, que não é nada mais que uma função. Os métodos e atributos do objeto são todos declarados dentro do construtor. No exemplo a seguir, mostra a criação de um objeto Compromisso, junto com as seus atributos:

//Construtor de um compromisso de uma agenda (Compromisso)
function Compromisso(nome,inicio,fim){
    //Declaração dos atributos
    this.nome = nome;
    this.dtInicio = inicio;
    this.dtFim = fim;
   
}

segunda-feira, 29 de outubro de 2012

PHP: Manipulação de Arquivos


1. Abrindo um Arquivo

Esse tutorial irá ensinar como manipular arquivos, utilizando o PHP. A primeira coisa que deve ser feita quando for manipular um arquivo é abrí-lo. Para abrir utiliza-se a função fopen() para abrir. O protótipo da função é a seguinte:

resource fopen ( string $filename, string $mode [, int $use_include_path [, resource $context]] )

onde:
  • $filename: Nome do arquivo a ser aberto;
  • $mode: é o modo de acesso do arquivo;
  • $ use_include_path (opcional): indica se o arquivo deve ser procurado nos diretórios especificados no include_path do php.ini ;
  • $context (opcional): permite a definição de um contexto, que é um conjunto de parâmetros que modificam o comportamento do arquivo.

quinta-feira, 26 de julho de 2012

.NET e C♯: Criando e Usando um Assembly

Essa é uma das postagens que se originou nas minhas pesquisas para montar aulas para um curso de .NET que eu aceitei fazer. Precisava reciclar, pois eu aprendi a usar .NET no tempo do ensino técnico, que faz uns 7 anos que me formei. Uma das coisas que percebi é a carência de material decente para .NET, sendo que o melhor é uma apostila de quando o .NET foi recém criada, ou seja, muita coisa mudou e estou me batendo muito para reciclar.

Uma das coisas que quero trabalhar são os diferenciais do .NET, afinal, não acho que vale a pena falar de um framework que faz a mesma coisa que os outros. E uma das coisas que o .NET faz bem é fazer com que programas de diversas linguagens de programação se comuniquem como se fosse a mesma linguagem. Tudo isso graças ao Assembly, que não é nada mais do que o programa em uma linguagem intermediária própria do .NET.

Nas minhas aulas, eu utilizo o  C♯ em conjunto com .NET, uma vez que a linguagem foi criada com o propósito de ser trabalhada com o .NET, mas pode ser utilizada em qualquer outra linguagem que seja compatível com o .NET.

quinta-feira, 28 de junho de 2012

iOS: Cuidando do erro "object file format invalid or unsuitable" e outros problemas com Certificado Digital da Apple

Um dos problemas mais terríveis que já passei desenvolvendo para iOS foi esse: no Emulador tudo certinho, mas quando tento rodar no aparelho: Compilação OK, assinando o aplicativo FAIL: "/usr/bin/codesign failed with exit code 1". Clico para ver mais detalhes e aparece a seguinte mensagem: "object file format invalid or unsuitable".

terça-feira, 5 de junho de 2012

iOS: Aplicativos em Tela Cheia (Full Screen)

No iOS, é simples de configurar com que o aplicativo fique totalmente em tela cheia, ou seja, sem a barra de status na parte de cima. Para configurar a tela cheia:

  • Abra o arquivo Info.plist do projeto;
  • Procure o campo "UIStatusBarHidden" se tiver usando um Xcode antigo, ou  "Status bar is initially hidden" nos mais atuais;
  • Caso o campo ainda não foi definido, crie mais uma linha contendo o campo;
  • Esse campo vai ter uma caixa checkbox. Assinale ela para fazer com que o programa entre no modo Tela cheia.
Campo do info.plist que vai ser alterado

segunda-feira, 28 de maio de 2012

iOS: Localização: Fazendo um Aplicativo Para Vários Idiomas

Mais um tutorial para iOS. Vamos ver como fazer com que o aplicativo altere o idioma para o idioma do sistema. Para quem quer vender internacionalmente, é fundamental que o aplicativo esteja disponível em maior números de idiomas possíveis.

Para começar, abrindo a pasta do projeto no Finder, vamos criar as pastas onde os arquivos localizados (no sentido de tradução) vão ser colocados. O nome da pasta vai ser o código do idioma, sendo que deve estar no formato ISO 639-1 ou  ISO 639-2, com uma extensão *.lproj. Por exemplo: quero que meu aplicativo tenha o idioma em Português, Inglês e Espanhol, serão criadas três pastas:
  • pt.lproj: para o português;
  • en.lproj: para o inglês;
  • es.lproj: para o espanhol;

quinta-feira, 17 de maio de 2012

iOS: O iPhone começa a tocar - Tratando interrupções no iOS

Você está lá, usando um aplicativo ou jogando quando seu iPhone toca.Você atende o telefone e quando volta a jogar, FUUUUU! Você está na tela de Game Over porque o aplicativo continuou executando em background. Ou pior, você não consegue falar com o seu interlocutor porque a música do jogo continuou sendo executado.

Esses problemas são muito comum e muito negligenciado. Primeiro porque muitos desenvolvedores nem passa pela cabeça em receber ligação ou que o sistema operacional pode mandar alguma mensagem de aviso. E quando passa pela cabeça, temos que se matar na documentação mal-organizada da Apple.

Por isso, estou fazendo esse tutorial. Depois de esbarrar na documentação e ter que interpretar o que eles quiseram falar: