sexta-feira, 24 de junho de 2011

Ilustrando a Engenharia de Software

segunda-feira, 11 de maio de 2009

Integração Spring + JPA

No link abaixo segue segue tutorial com exemplo de integração do JPA com o framework Spring:
http://cristripoli.wordpress.com/2009/05/11/integracao-jpa-spring/

domingo, 15 de fevereiro de 2009

Boleto, duplicata, triplicata, nota fiscal

Nota Fiscal

É o documento que comprova a existência de um ato comercial (compra e venda de mercadorias ou prestação de serviços) ; tem a necessidade maior de atender às exigências do Fisco, quanto ao trânsito das mercadorias e das operações realizadas entre adquirentes e fornecedores.
link

Fatura

É o documento que comprova a venda a prazo. Numa mesma fatura podem ser incluídas várias notas fiscais. A duplicata tem esse nome por ser uma cópia da fatura .a lei permite a emissão de várias duplicatas para uma mesma fatura ( não é concebido, no entanto, a emissão de uma duplicata para várias faturas).
link

Duplicata

É um título de crédito resultante da venda mercantil ou prestação de serviços. Trata-se, portanto, de título causal. Figuras da duplicata: sacador (emitente, vendedor ) e sacado ( comprador, devedor, aceitante).
link

A duplicata é um titulo de crédito casual , facultativamente emitido pelo vendedor com base em fatura representativa de compra e venda mercantil. No caso de perda ou extravio é emitido esta nova cópia (triplicata)
link


Triplicata

É o título mercantil sacado para substituir duplicata perdida ou extraviada. Trata-se de mera cópia ou segunda via da duplicata.
link


Boleto Bancário

Segundo o Manual Técnico Operacional da FEBRABAN - Federação Brasileira das Associações de Bancos, o conceito de Boleto Bancário “É um documento que representa títulos em cobrança, tais como: duplicatas, notas promissórias, recibos, bilhetes e notas de seguros e outras espécies, pagáveis através da rede bancária.” link

Segundo o site da COBRE BEM TECNOLOGIA: O Boleto Bancário representa um título de cobrança pagável em qualquer agência bancária do território nacional, homebanking, Casas Lotéricas, Supermercados e Agências dos Correios durante o período de vencimento.
link

Endosso

Endosso é a transferência de direitos de crédito a um terceiro (endosso translativo) ou simplesmente autorização para um terceiro fazer a cobrança em nome do credor (endosso mandato). Qualquer título de crédito poderá ser objeto de endosso.
link

Título de crédito
Título de crédito genericamente expressando, é um documento que tem como objetivo representar um crédito relativo a uma transação específica de mercado, facilitando desta forma a sua circulação entre diversos titulares distintos, substituindo num dado momento a moeda corrente ou dinheiro em espécie, além de garantir a segurança da transação.

Considerando suas principais características e o que melhor expressa a doutrina, podemos conceituar título de crédito como um documento representativo do direito de crédito pecuniário que nele se contém e que pode ser executado por si mesmo, de forma literal e autônoma, independentemente de qualquer outro negócio jurídico subjacente ou subentendido, bastando que preencha os requisitos legais.
link

segunda-feira, 26 de janeiro de 2009

Configuração de Variáveis de Ambiente


No painel de controle do Windows ir em Sistemas:



Na guia Avançados, vá em variáveis de ambiente:





Em variáveis de sistema crie uma nova variável:





Localize em sua máquina onde foi instalado o JDK, geralmente ele fica em C:Arquivos de programasJava, caso não esteje, encontre a pasta Java em seu sistema.
Coloque o nome da variável de JAVA_HOME e seu valor como o caminho do JDK instalado: C:Arquivos de programasJavajdk1.6.0. Confirme o caminho pois a versão do seu JDK pode ser diferente desta. Depois clique em OK.






Após isso clicaremos outra vez em nova para cria outra variável.
Coloque o nome da variável de CLASSPATH e seu valor como .;%JAVA_HOME%libtools.jar que é onde está o jar tools. Depois clique em OK.


Agora localize a variável Path e clique em Edit?


Acrescente ao valor da variável o seguinte: %JAVA_HOME%bin. E clique em OK.





E pronto! Agora é só reiniciar a máquina para que as alterações tenham efeito.



Div se movimentando horizontalmente de acordo com o tempo

Segue link para códico html/css em que uma div sobreposta a outra div se movimenta horizontalmente na tela de acordo com o tempo.

link para conteúdo

quinta-feira, 22 de janeiro de 2009

Apostila de Python

Link para apostila de python 2.4.2 da Python Software Foundation:

apostila python

segunda-feira, 12 de janeiro de 2009

Pesquisa: O Comportamento Organizacional em Diferentes Estados do País

Esta pesquisa tem por finalidade estudar o comportamento organizacional em diferentes estados do país. Um questionário foi elaborado e, através das repostas colhidas de pessoas de diferentes estados, procuramos observar alguns pontos dentro da estrutura organizacional da empresa em que essas pessoas trabalham.

Entre os aspectos que procuramos abordar na pesquisa estão: liderança, cobrança, flexibilidade, relacionamento com os demais indivíduos do grupo, reuniões, etc.

A seguir apresentaremos o questionário que foi utilizado na pesquisa, as respostas dadas pelos entrevistados na íntegra e depois a análise da pesquisa.

--------------------------------------------------------------
Questionário de Pesquisa Utilizado


Esta é uma pesquisa para fins acadêmicos que procura revelar características próprias do comportamento organizacional em um estado ou região. Exponha com as suas palavras e fique livre para responder as perguntas que quiser.

Cidade onde mora:
Cargo que ocupa:
Ramo de atividade da empresa:

1 - Como você considera seu líder: autoritário, aberto, carismático, motivador ou qualquer outra característica que possa descrevê-lo.

2 - Na sua empresa, como é a cobrança pelos resultados? Como é feita a divisão das tarefas?

3 - Como são as reuniões, há uma ata? Como o assunto é exposto? São reuniões formais ou informais? Há pontualidade?

4 - Seus horários na empresa são flexíveis?

5 - Como é o relacionamento entre as pessoas que trabalham com você? È homogêneo ou há uma divisão em grupos (panelas)?

6 - Você diria que há comprometimento do funcionário para com a empresa, da empresa para com o funcionário ou ambos?

7 - O que você considera que há de melhor no lugar onde trabalha? E de pior?

Alunos do curso de Sistemas de Informação da Universidade do Vale do Sapucaí

--------------------------------------------------------------

Abaixo seguem as respostas (na íntegra) dadas por cada um dos que responderam à pesquisa:

--------------------------------------------------------------
Bruno - João Pessoa - Paraíba

Cargo que ocupa: Estagiário
Ramo de atividade da empresa: Desenvolvimento de software

Como você considera seu líder: autoritário, aberto, carismático, motivador ou qualquer outra característica que possa descrevê-lo.
Aberto, motivador, carismático.

Na sua empresa, como é a cobrança pelos resultados? Como é feita a divisão das tarefas?
É estipulado prazos para entregas de releases do projeto, acompanhamento constante do superior, quanto ao andamento das atividades, as tarefas são divididas.

Como são as reuniões, há uma ata? Como o assunto é exposto? São reuniões formais ou informais? Há pontualidade?
Sim, assuntos expostos por macro temas, existem reuniões formais e informais, há pontualidade.

Seus horários na empresa são flexíveis?
Sim.

Como é o relacionamento entre as pessoas que trabalham com você? È homogêneo ou há uma divisão em grupos (panelas)?
Homogêneo.

Você diria que há comprometimento do funcionário para com a empresa, da empresa para com o funcionário ou ambos?
Ambos.

O que você considera que há de melhor no lugar onde trabalha? E de pior?
De melhor a convivência, cobrança por partes de clientes.

--------------------------------------------------------------
Johny – Belém – Pará

Cargo que ocupa: Projetista – Computacional
Ramo de atividade da empresa: Desenvolvimento Java, PHP, Delphi, C++ e etc...

Como você considera seu líder: autoritário, aberto, carismático, motivador ou qualquer outra característica que possa descrevê-lo.
Carismático, mais muito exigente com qualidade do trabalho

Na sua empresa, como é a cobrança pelos resultados? Como é feita a divisão das tarefas?
Divisão de tarefas, todo projeto entre-si tem cobrança ou terá alguem que faça melho que você!! Projetos são dividos em tarefas quando se existe Analista!

Como são as reuniões, há uma ata? Como o assunto é exposto? São reuniões formais ou informais? Há pontualidade?
Reuniões com Atas........Cada desenvolvedor tem uma palta.
Pontualidade sim.........toda reunião existem..

Seus horários na empresa são flexíveis?
Relativo.....

Como é o relacionamento entre as pessoas que trabalham com você? È homogêneo ou há uma divisão em grupos (panelas)?
homogêneo .

Você diria que há comprometimento do funcionário para com a empresa, da empresa para com o funcionário ou ambos?
Logico..........não existem empresa sem funcionarios..........
se não haver comprometimente entra ambas as partes.........digira que o barco vai afundar...

O que você considera que há de melhor no lugar onde trabalha? E de pior?
Tem muita mulher programadora...........isso e bom
Podemos descutir ...........algo tipo "Toques femininos".

--------------------------------------------------------------
Juliano - Foz do Iguaçu – Paraná

Cargo que ocupa: Programador
Ramo de atividade da empresa: Desenvolvimento de Energia – Itaipu Binacional

Como você considera seu líder: autoritário, aberto, carismático, motivador ou qualquer outra característica que possa descrevê-lo.
R: Carismático

Na sua empresa, como é a cobrança pelos resultados? Como é feita a divisão das tarefas?
R: A divisão das tarefas é feita por equipe de desenvolvimento, composta por analistas e desenvolvedores. Os desenvolvedores recebem os casos de uso e desenvolvem de acordo com o cronograma que normalmente é bem folgado.

Como são as reuniões, há uma ata? Como o assunto é exposto? São reuniões formais ou informais? Há pontualidade?
R: Reuniões formais com horários marcados, atas e ministrante. Normalmente com membros participantes através de videoconferência a partir de Curitiba-PR e Assunção-PY.

Seus horários na empresa são flexíveis?
Não. Mas existem funcionário que trabalham dessa forma.

Como é o relacionamento entre as pessoas que trabalham com você? È homogêneo ou há uma divisão em grupos (panelas)?
R: Sempre existem as divisões, mas normalmente é uma divisão sutil, não interferindo no relacionamento geral.

Você diria que há comprometimento do funcionário para com a empresa, da empresa para com o funcionário ou ambos?
R: Muito mais da empresa para com os funcionários. Salvo algumas exceções de funcionários mais dedicados.

O que você considera que há de melhor no lugar onde trabalha? E de pior?
R: De melhor: Incentivos por parte da empresa, fornecendo bom computadores, restaurantes, horários movem, dentre outros benefícios.
De pior: Comodismo dos funcionários mais antigos.

--------------------------------------------------------------
Júnior – Gaspar – Santa Catarina

Cargo que ocupa: Programador
Ramo de atividade da empresa: Desenvolvimento de Sistemas

Como você considera seu líder: autoritário, aberto, carismático, motivador ou qualquer outra característica que possa descrevê-lo.
Aberto, carismático, motivador.

Na sua empresa, como é a cobrança pelos resultados? Como é feita a divisão das tarefas?
São dados prazos para a entrega dos projetos.

Como são as reuniões, há uma ata? Como o assunto é exposto? São reuniões formais ou informais? Há pontualidade?
Há uma ata, são reuniões informais.

Seus horários na empresa são flexíveis?
Sim.

Como é o relacionamento entre as pessoas que trabalham com você? È homogêneo ou há uma divisão em grupos (panelas)?
Bem Homogêneo.

Você diria que há comprometimento do funcionário para com a empresa, da empresa para com o funcionário ou ambos?
Sim.

O que você considera que há de melhor no lugar onde trabalha? E de pior?
O clima de amizade, aqui todos fazem por vontade própria e não pq é mandado, acho que o mais importante aqui é a liberdade de se fazer o que quer e quando quer.

--------------------------------------------------------------
Lincoln – Manaus - Amazonas

Cargo que ocupa: Técnico de Informática
Ramo de atividade da empresa: Tecnologia, pesquisa e desenvolvimento

Como você considera seu líder: autoritário, aberto, carismático, motivador ou qualquer outra característica que possa descrevê-lo.
Autoritário e subordinado, Sem opnião própria apenas ouvi o que seu chefe diz e executa de forma autoritária.

Na sua empresa, como é a cobrança pelos resultados? Como é feita a divisão das tarefas?
De forma obrigatória, se você fez é porque é sua obrigação, e tipo a divisão é de acordo como suas conclusões se terminou um trabalho começa outro em seguida.

Como são as reuniões, há uma ata? Como o assunto é exposto? São reuniões formais ou informais? Há pontualidade?
Sim existe ata, mas é mera formalidade e não há pontualidade.

Seus horários na empresa são flexíveis?
Não, você entra as 08:00 e tem de sair as 18:00 sem flexibilidade
Se chegar atrasado e descontado e se passar do horário é chamado à atenção e nada de ganhos extras.

Como é o relacionamento entre as pessoas que trabalham com você? È homogêneo ou há uma divisão em grupos (panelas)?
Sempre a divisões de grupos pois faz parte de toda empresa, sempre tem aqueles famosos puxa sacos que querem crescer dentro da empresa

Você diria que há comprometimento do funcionário para com a empresa, da empresa para com o funcionário ou ambos?
Sim existe, mas de forma muito grosseira onde eu faço por que ma pagam e pago por que você faz.

O que você considera que há de melhor no lugar onde trabalha? E de pior?
Sempre há pessoas com um sentimento maior onde podemos ver o mundo de uma ângulo melhor, são poucas pessoas mais existem aqueles que ti incentivam e te mostram o caminho além do que vemos no trabalho. E o pior são as pessoas que se fecham naquele mundo e acham que podem humilhar e passar por cima de tudo e de todos sem perceber que o mundo não é somente aquilo no caso os lideres mau preparados.

--------------------------------------------------------------
Simone – Jundiaí – São Paulo

Cargo que ocupa: Analista de Sistemas e Desenvolvedor
Ramo de atividade da empresa: Serviços

Como você considera seu líder: autoritário, aberto, carismático, motivador ou qualquer outra característica que possa descrevê-lo.
Numa grande empresa os líderes são muito ocupados, quase inatingíveis, é difícil para os subordinados manterem contato direto com os gerentes e líderes, por isso existem vários cargos de supervisor para diminuir a distancia e tratar de alguns assuntos com os funcionários.

Na sua empresa, como é a cobrança pelos resultados? Como é feita a divisão das tarefas?
Através dos gerentes de projetos ou coordenadores de projetos via reuniões semanais por telefone.

Como são as reuniões, há uma ata? Como o assunto é exposto? São reuniões formais ou informais? Há pontualidade?
Sempre há uma ata digital gravada numa base lótus notes para que todos do time tenham acesso às informações. As reuniões são sempre por telefone e em inglês, devido a participação de pessoas de outros países nas reuniões. São reuniões formais e sempre existe pontualidade

Seus horários na empresa são flexíveis?
Sim, existe inclusive a possibilidade de trabalho remoto em casa (home office)

Como é o relacionamento entre as pessoas que trabalham com você? È homogêneo ou há uma divisão em grupos (panelas)?
Existe divisão em grupos

--------------------------------------------------------------
Análise da Pesquisa

Com as entrevistas podemos notar que o comportamento de cada organização difere de acordo com a cultura e a maneira de liderar de seus líderes. Se os líderes são mais carismáticos e motivadores os seus subordinados tem um comprometimento mais verdadeiro com a empresa, esse comprometimento com certeza colabora para um produto ou serviço de maior qualidade e conseqüentemente todas as partes lucram com isso.

Cada empresa tem sua maneira de dividir suas tarefas, cobrar resultados e ministrar suas reuniões. Algumas são mais flexíveis, já outras um pouco mais rigorosas. É essa diferença que faz com que sejam competitivas.

Analisando as pesquisas podemos observar que na área de desenvolvimento de software as empresas têm características muito semelhantes mesmo analisando estados bem distantes.
É claro que cada região tem sua cultura e isso influi diretamente no clima organizacional. Mas dos aspectos abordados nesta pesquisa podemos observar muitos pontos em comum.

Dentre alguns pontos que observamos estão: flexibilidade de horários, trabalho em cima de metas, líder motivador, reuniões formais e informais, atas (algumas digitais), divisões em grupos.
Mas além do fator região há inúmeros outros fatores que influenciam no comportamento organizacional, fatores como: marca da organização, ramo de atividade, números de funcionários. Por isso não se pode analisar um único fator para medir as diferenças de comportamento.

Alunos do Curso de Sistemas de Informação da Universidade do Vale do Sapucaí

terça-feira, 2 de dezembro de 2008

Exemplo Xlet

public class ExemploXlet implements Xlet, KeyListener {
private XletContext context;
private HScene scene;
private HStaticText label1, label2;
public ExemploXlet() { }
public void initXlet(XletContext xletContext)
throws XletStateChangeException {
this.context = xletContext;
}
public void startXlet()
throws XletStateChangeException {
HSceneFactory hsceneFactory = HSceneFactory.getInstance();
scene = hsceneFactory.getFullScreenScene(HScreen.getDefaultHScreen().
getDefaultHGraphicsDevice());
scene.setSize(640, 480);
scene.setLayout(null);
scene.addKeyListener(this);
label1 = new HStaticText("Al\u00F4 MundoJava!", 35, 45, 660, 50,
new Font("Tiresias", 1, 36),
Color.red, Color.white,
new HDefaultTextLayoutManager());
label2 = new HStaticText("Controle Remoto", 100, 135, 500, 30,
new Font("Tiresias", 1, 36),
Color.red, Color.white,
new HDefaultTextLayoutManager());
scene.add(label1);
scene.add(label2);
scene.setVisible(true);
scene.requestFocus();
}
public void pauseXlet() { }
public void destroyXlet(boolean unconditional)
throws XletStateChangeException {
if (scene!=null) {
scene.setVisible(false);
scene.removeAll();
scene = null;
}
context.notifyDestroyed();
}
/* Método de java.awt.event.KeyListener */
public void keyTyped(KeyEvent keyevent) { }
/* Método de java.awt.event.KeyListener */
public void keyReleased(KeyEvent keyevent) {}
/* Método de java.awt.event.KeyListener */
public void keyPressed(KeyEvent e) {
String mensagem = "";
int codigo = e.getKeyCode();
switch (codigo) {
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
mensagem += "Bot\u00E3o num\u00E9rico: "+(codigo-48);
break;
case 403:
mensagem += "Bot\u00E3o Vermelho";
break;
case 404:
mensagem += "Bot\u00E3o Verde";
break;
case 405:
mensagem += "Bot\u00E3o Amarelo";
break;
case 406:
mensagem += "Bot\u00E3o Azul";
break;
case 27:
mensagem += "Bot\u00E3o EXIT";
break;
case 10:
mensagem += "Bot\u00E3o OK";
break;
case 151:
mensagem += "Bot\u00E3o Asterisco (*)";
break;
case 520:
mensagem += "Bot\u00E3o grade (#)";
break;
case 38:
mensagem += "Seta para cima";
break;
case 40:
mensagem += "Seta para baixo";
break;
case 37:
mensagem += "Seta para esquerda";
break;
case 39:
mensagem += "Seta para direita";
break;
default:
mensagem += "Al\u00F4 MundoJava!";
}
label2 = new HStaticText(mensagem, 100, 135, 500, 30,
new Font("Tiresias", 1, 36),
Color.blue, Color.white,
new HDefaultTextLayoutManager());
scene.removeAll();
scene.add(label1);
scene.add(label2);
label2.repaint();
scene.repaint();
}
}


// Retirado da revista MundoJava
// www.mundojava.com.br

sábado, 29 de novembro de 2008

Controle de Vendas e Estoque

Vendas&EstoqueDL (Freeware)

Este é um programa para controle de vendas e estoque em um estabelecimento comercial. É feito em Java e todo o código está dísponível. O programa está em desenvolvimento e novas funcionalidades estão sendo criadas. O código é facilmente adaptável à outras aplicações, para importar o código use Ecliple IDE 3.2 ou posterior.

Download:
https://sourceforge.net/projects/vendasestoquedl

terça-feira, 25 de novembro de 2008

Exemplo gráfico de pizza no JFreeChart

//Requirido a API do JFreeChart

import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;

public class ChartFrame extends JFrame
{
private static final long serialVersionUID = 1L;
private DefaultPieDataset dataset;
private JFreeChart jfc;
public ChartFrame()

{
dataset = new DefaultPieDataset();
}

public void setValue(String title, Double numDouble)
{
dataset.setValue(title, numDouble);
}

public void setChar(String title)
{

jfc = ChartFactory.createPieChart(title, dataset, true, true, false);
PiePlot pp = (PiePlot) jfc.getPlot();
pp.setSectionOutlinesVisible(false);
pp.setLabelFont(new Font("SansSerif", Font.PLAIN, 12));
pp.setNoDataMessage("Nessun Dato Inserito");
pp.setCircular(false);
pp.setLabelGap(0.02);
}

private JPanel createPanel()
{
return new ChartPanel(jfc);
}

public void Show()
{
setContentPane(createPanel());
setVisible(true);
}

public static void main(String[] args)
{
ChartFrame j = new ChartFrame();
j.setTitle("Example Chart...");
j.setSize(640, 430);
j.setValue("UNO", new Double(20.0));
j.setValue("DUE", new Double(10.0));
j.setValue("TRE", new Double(20.0));
j.setValue("QUATTRO", new Double(30.0));
j.setValue("CINQUE", new Double(20.0));
j.setChar("Example Chart...");
j.Show();
}

}

Instalando e configurando o Archiva no Tomcat

Primeiramente você terá que fazer o download do Apache Tomcat e do Archiva e do Java. A versões usadas nesse tutorial foram:
- Java 1.6;
- Tomcat 5.27;
- Archiva 1.2-M1.

Faça o download do War e do Standalone do Archiva pois iremos precisar dos dois.
- Java: http://java.sun.com/javase/downloads/index.jsp
- Tomcat: http://tomcat.apache.org/download-55.cgi
- Archiva: http://archiva.apache.org/download.html

Agora vamos as instalações:
• Instale o Java em sua máquina e crie uma variável de ambiente chamada JAVA_HOME, e aponte ela para o local que foi instalado o Java;
• Depois descompacte o Tomcat no C:\ da sua máquina e crie uma variável de ambiente chamada CATALINA_HOME, e aponte para o local que você descompactou o Tomcat;
• Agora crie uma pasta chamada ‘archiva’ dentro do Tomcat, no mesmo nível que as pastas bin, conf, logs e outras;
• Copie o arquivo War do Archiva para dentro desta pasta que você acabou de criar;
• Crie um arquivo chamado ‘archiva.xml’ e coloque dentro da pasta
tomcat_home/conf/Catalina/localhost/ com o seguinte conteúdo:

link para o contéudo

Observação: Na tag Resource, a propriedade url é o caminho do banco de dados que o Archiva irá usar. Você pode definir qualquer caminho.

• Agora descompacte o Archiva Standalone que você baixou. Acesse a pasta descompactada e abra a pasta lib. Dentro desta pasta copie esses 3 arquivos:
- derby-10.1.3.1.jar (or later);
- activation-1.1.jar;
- mail-1.4.jar.
Abra a pasta tomcat_home\common\lib e cole esses 3 arquivos.

• Agora crie mais uma variável de ambiente chamada CATALINA_OPTS com o seguinte valor:
CATALINA_OPTS="-Dappserver.home=$CATALINA_HOME -Dappserver.base=$CATALINA_HOME"


Pronto! Agora é só acessar http://localhost:8080/archiva e começar a usar. A primeira página que o Archiva irá lhe mostrar será uma página pedindo para você cadastrar um Administrador.

Configurando o Maven com o Archiva

Para usar o Archiva como repositório para o Maven você precisa criar um arquivo chamado settings.xml e colocar dentro da pasta user_home/.m2. O conteúdo desse arquivo será:

link para conteúdo

Para que você consiga fazer o deploy de sua aplicação você precisa inserir o seguinte código no seu pom.xml:

link para conteúdo

Agora é só usar!

Tutorial elaborado por Rodrigo Luís de Faria.
Email: rodrigolfsi@gmail.com

domingo, 16 de novembro de 2008

Criptografia Base64 em Lua

--implementacao de criptografia Base64 em linguagem Lua.

local bin = { }

function bin.imod(a, b)
return a - math.floor(a / b) * b
end

function bin.rshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a / (2 ^ b))
end

function bin.lshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a * (2 ^ b))
end

function bin.band(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) and (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) or (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bxor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1 ~= b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bnot(a)
local i, v, r, b

if (a < 0) then
a = 4294967296 + a
end

a = bin.imod(a, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b = a >= v

if (b) then
a = a - v
else
r = r + v
end
end

return r
end

local cb64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

b64 = {}

local function istr(p)
return string.sub(cb64, p + 1, p + 1)
end

function b64.encodeblock(in_tab, len)
local s1, s2, s3, s4

in_tab[0] = in_tab[1] or 0
in_tab[1] = in_tab[2] or 0
in_tab[2] = in_tab[3] or 0

s1 = istr(bin.rshift(in_tab[0], 2))
s2 = istr(bin.bor(bin.lshift(bin.band(in_tab[0], 3), 4), bin.rshift(bin.band(in_tab[1], 240), 4)))
s3 = (len > 1 and istr(bin.bor(bin.lshift(bin.band(in_tab[1], 15), 2), bin.rshift(bin.band(in_tab[2], 192), 6))) or "=")
s4 = (len > 2 and istr( bin.band(in_tab[2], 63)) or "=")

return s1..s2..s3..s4
end

function b64.encode(stream, stream_size)
local encoded = ""
local e_block
local in_tab, len, i, s_pos

s_pos = 0

while stream_size > 0 do
in_tab = {}

len = stream_size >= 3 and 3 or stream_size

for i = 1, len do
in_tab[i] = stream[s_pos + i]
end

e_block = b64.encodeblock(in_tab, len)

encoded = encoded .. e_block

s_pos = s_pos + 3
stream_size = stream_size - 3
end

return encoded
end

local function stri(s)
return s == "=" and -1 or (string.find(cb64, s) - 1)
end

function b64.decodeblock(s1, s2, s3, s4)
local b1, b2, b3, len

len = s3 == "=" and 1 or s4 == "=" and 2 or 3

s3 = s3 == "=" and "A" or s3
s4 = s4 == "=" and "A" or s4

s1 = stri(s1)
s2 = stri(s2)
s3 = stri(s3)
s4 = stri(s4)

b1 = bin.bor(bin.lshift(s1, 2), bin.rshift(s2, 4))
b2 = bin.bor(bin.band(bin.lshift(s2, 4), 255), bin.rshift(s3, 2))
b3 = bin.bor(bin.band(bin.lshift(s3, 6), 240), s4)

return {b1, b2, b3}, len
end

function b64.decode(str_in)
local s_len = string.len(str_in) / 4
local out, len, i, j, t_out, s1, s2, s3, s4, t_len = {}, 0

for i = 1, s_len do
s1 = string.sub(str_in, i * 4 - 3, i * 4 - 3)
s2 = string.sub(str_in, i * 4 - 2, i * 4 - 2)
s3 = string.sub(str_in, i * 4 - 1, i * 4 - 1)
s4 = string.sub(str_in, i * 4 - 0, i * 4 - 0)
t_out, t_len = b64.decodeblock(s1, s2, s3, s4)

for j = 1, t_len do
out[i * 3 - 3 + j] = t_out[j]
end

len = len + t_len
end

return out, len
end



b64_test_in = {
48, 49, 50, 51, 52, 53, 54, 55, 56, 57
}

b64_test_enc = "MDEyMzQ1Njc4OQ=="

function test_b64()
local enc, dec, i, len

enc = b64.encode(b64_test_in, 10)
assert(enc == b64_test_enc)
dec, len = b64.decode(enc)
assert(len == 10)
for i = 1, len do
assert(b64_test_in[i] == dec[i])
end
end

test_b64()
print(b64.encode(b64_test_in, 10))

terça-feira, 4 de novembro de 2008

Pesquisa por ano e mês em sql

Em uma tabela com um campo do tipo date, para fazer uma consulta apenas por mês ou apenas por ano é comum se utilizar as funções MONTH e YEAR:

select * from tabela where MONTH(campo)=2;

select * from tabela where YEAR(campo)=2008;

Porém este tipo de pesquisa sempre gera um TABLE SCAN (uma varredura em toda a tabela), ignorando os índices que por ventura existam e retardando em muito o tempo de resposta.

Uma maneira de fazer a mesma coisa e de forma mais eficiente segue abaixo:

WHERE campo BETWEEN '2008-01-01' AND '2008-01-31'

WHERE campo BETWEEN '2008-01-01' AND '2008-12-31'

segunda-feira, 3 de novembro de 2008

Criptografia MD5 em Lua

-- Código em Lua para criptografia MD5

local bin = { }

function bin.imod(a, b)
return a - math.floor(a / b) * b
end

function bin.rshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a / (2 ^ b))
end

function bin.lshift(a, b)
if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

return math.floor(a * (2 ^ b))
end

function bin.band(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) and (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1) or (b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bxor(a, b)
local i, v, r, b1, b2

if (a < 0) then
a = 4294967296 + a
end
if (b < 0) then
b = 4294967296 + b
end

a = bin.imod(a, 4294967296)
b = bin.imod(b, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b1 = a >= v
b2 = b >= v

if (b1 ~= b2) then
r = r + v
end

if (b1) then
a = a - v
end
if (b2) then
b = b - v
end
end

return r
end

function bin.bnot(a)
local i, v, r, b

if (a < 0) then
a = 4294967296 + a
end

a = bin.imod(a, 4294967296)

r = 0
for i = 31, 0, -1 do
v = 2 ^ i
b = a >= v

if (b) then
a = a - v
else
r = r + v
end
end

return r
end

local X
local md5={ff=tonumber('ffffffff',16),consts={}}

string.gsub([[
d76aa478 e8c7b756 242070db c1bdceee
f57c0faf 4787c62a a8304613 fd469501
698098d8 8b44f7af ffff5bb1 895cd7be
6b901122 fd987193 a679438e 49b40821
f61e2562 c040b340 265e5a51 e9b6c7aa
d62f105d 02441453 d8a1e681 e7d3fbc8
21e1cde6 c33707d6 f4d50d87 455a14ed
a9e3e905 fcefa3f8 676f02d9 8d2a4c8a
fffa3942 8771f681 6d9d6122 fde5380c
a4beea44 4bdecfa9 f6bb4b60 bebfbc70
289b7ec6 eaa127fa d4ef3085 04881d05
d9d4d039 e6db99e5 1fa27cf8 c4ac5665
f4292244 432aff97 ab9423a7 fc93a039
655b59c3 8f0ccc92 ffeff47d 85845dd1
6fa87e4f fe2ce6e0 a3014314 4e0811a1
f7537e82 bd3af235 2ad7d2bb eb86d391
67452301 efcdab89 98badcfe 10325476 ]],
'(%w+)', function (s) table.insert(md5.consts,tonumber(s,16)) end)

function md5.transform(A,B,C,D)
local f=function (x,y,z) return bin.bor(bin.band(x,y),bin.band(-x-1,z)) end
local g=function (x,y,z) return bin.bor(bin.band(x,z),bin.band(y,-z-1)) end
local h=function (x,y,z) return bin.bxor(x,bin.bxor(y,z)) end
local i=function (x,y,z) return bin.bxor(y,bin.bor(x,-z-1)) end
local z=function (f,a,b,c,d,x,s,ac)
a=bin.band(a+f(b,c,d)+x+ac,md5.ff)
-- be *very* careful that left shift does not cause rounding!
return bin.bor(bin.lshift(bin.band(a,bin.rshift(md5.ff,s)),s),bin.rshift(a,32-s))+b
end
local a,b,c,d=A,B,C,D
local t=md5.consts

a=z(f,a,b,c,d,X[ 0], 7,t[ 1])
d=z(f,d,a,b,c,X[ 1],12,t[ 2])
c=z(f,c,d,a,b,X[ 2],17,t[ 3])
b=z(f,b,c,d,a,X[ 3],22,t[ 4])
a=z(f,a,b,c,d,X[ 4], 7,t[ 5])
d=z(f,d,a,b,c,X[ 5],12,t[ 6])
c=z(f,c,d,a,b,X[ 6],17,t[ 7])
b=z(f,b,c,d,a,X[ 7],22,t[ 8])
a=z(f,a,b,c,d,X[ 8], 7,t[ 9])
d=z(f,d,a,b,c,X[ 9],12,t[10])
c=z(f,c,d,a,b,X[10],17,t[11])
b=z(f,b,c,d,a,X[11],22,t[12])
a=z(f,a,b,c,d,X[12], 7,t[13])
d=z(f,d,a,b,c,X[13],12,t[14])
c=z(f,c,d,a,b,X[14],17,t[15])
b=z(f,b,c,d,a,X[15],22,t[16])

a=z(g,a,b,c,d,X[ 1], 5,t[17])
d=z(g,d,a,b,c,X[ 6], 9,t[18])
c=z(g,c,d,a,b,X[11],14,t[19])
b=z(g,b,c,d,a,X[ 0],20,t[20])
a=z(g,a,b,c,d,X[ 5], 5,t[21])
d=z(g,d,a,b,c,X[10], 9,t[22])
c=z(g,c,d,a,b,X[15],14,t[23])
b=z(g,b,c,d,a,X[ 4],20,t[24])
a=z(g,a,b,c,d,X[ 9], 5,t[25])
d=z(g,d,a,b,c,X[14], 9,t[26])
c=z(g,c,d,a,b,X[ 3],14,t[27])
b=z(g,b,c,d,a,X[ 8],20,t[28])
a=z(g,a,b,c,d,X[13], 5,t[29])
d=z(g,d,a,b,c,X[ 2], 9,t[30])
c=z(g,c,d,a,b,X[ 7],14,t[31])
b=z(g,b,c,d,a,X[12],20,t[32])

a=z(h,a,b,c,d,X[ 5], 4,t[33])
d=z(h,d,a,b,c,X[ 8],11,t[34])
c=z(h,c,d,a,b,X[11],16,t[35])
b=z(h,b,c,d,a,X[14],23,t[36])
a=z(h,a,b,c,d,X[ 1], 4,t[37])
d=z(h,d,a,b,c,X[ 4],11,t[38])
c=z(h,c,d,a,b,X[ 7],16,t[39])
b=z(h,b,c,d,a,X[10],23,t[40])
a=z(h,a,b,c,d,X[13], 4,t[41])
d=z(h,d,a,b,c,X[ 0],11,t[42])
c=z(h,c,d,a,b,X[ 3],16,t[43])
b=z(h,b,c,d,a,X[ 6],23,t[44])
a=z(h,a,b,c,d,X[ 9], 4,t[45])
d=z(h,d,a,b,c,X[12],11,t[46])
c=z(h,c,d,a,b,X[15],16,t[47])
b=z(h,b,c,d,a,X[ 2],23,t[48])

a=z(i,a,b,c,d,X[ 0], 6,t[49])
d=z(i,d,a,b,c,X[ 7],10,t[50])
c=z(i,c,d,a,b,X[14],15,t[51])
b=z(i,b,c,d,a,X[ 5],21,t[52])
a=z(i,a,b,c,d,X[12], 6,t[53])
d=z(i,d,a,b,c,X[ 3],10,t[54])
c=z(i,c,d,a,b,X[10],15,t[55])
b=z(i,b,c,d,a,X[ 1],21,t[56])
a=z(i,a,b,c,d,X[ 8], 6,t[57])
d=z(i,d,a,b,c,X[15],10,t[58])
c=z(i,c,d,a,b,X[ 6],15,t[59])
b=z(i,b,c,d,a,X[13],21,t[60])
a=z(i,a,b,c,d,X[ 4], 6,t[61])
d=z(i,d,a,b,c,X[11],10,t[62])
c=z(i,c,d,a,b,X[ 2],15,t[63])
b=z(i,b,c,d,a,X[ 9],21,t[64])

return A+a,B+b,C+c,D+d
end

function md5.Calc(s)
local msgLen=string.len(s)
local padLen=56-bin.imod(msgLen,64)
if bin.imod(msgLen,64)>56 then padLen=padLen+64 end
if padLen==0 then padLen=64 end
s=s..string.char(128)..string.rep(string.char(0),padLen-1)
s=s..leIstr(8*msgLen)..leIstr(0)
assert(bin.imod(string.len(s),64)==0)
local t=md5.consts
local a,b,c,d=t[65],t[66],t[67],t[68]
for i=1,string.len(s),64 do
X=leStrCuts(string.sub(s,i,i+63),4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4)
assert(table.getn(X)==16)
X[0]=table.remove(X,1) -- zero based!
a,b,c,d=md5.transform(a,b,c,d)
end
local swap=function (w) return beInt(leIstr(w)) end
return string.format("%08x%08x%08x%08x",swap(a),swap(b),swap(c),swap(d))
end

-- convert little-endian 32-bit int to a 4-char string
function leIstr(i)
local f=function (s) return string.char(bin.band(bin.rshift(i,s),255)) end
return f(0)..f(8)..f(16)..f(24)
end

-- convert raw string to big-endian int
function beInt(s)
local v=0
for i=1,string.len(s) do v=v*256+string.byte(s,i) end
return v
end
-- convert raw string to little-endian int
function leInt(s)
local v=0
for i=string.len(s),1,-1 do v=v*256+string.byte(s,i) end
return v
end
-- cut up a string in little-endian ints of given size
function leStrCuts(s,...)
local o,r=1,{}
for i=1,table.getn(arg) do
table.insert(r,leInt(string.sub(s,o,o+arg[i]-1)))
o=o+arg[i]
end
return r
end

function md5.dochecks()
s0='message digest'
s1='abcdefghijklmnopqrstuvwxyz'
s2='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
s3='1234567890123456789012345678901234567890'
..'1234567890123456789012345678901234567890'

assert(md5.Calc('')=='d41d8cd98f00b204e9800998ecf8427e')
assert(md5.Calc('a')=='0cc175b9c0f1b6a831c399e269772661')
assert(md5.Calc('abc')=='900150983cd24fb0d6963f7d28e17f72')
assert(md5.Calc(s0)=='f96b697d7cb7938d525a2f31aaf161d0')
assert(md5.Calc(s1)=='c3fcd3d76192e4007dfb496cca67e13b')
assert(md5.Calc(s2)=='d174ab98d277d9f5a5611c2c9f419d9f')
assert(md5.Calc(s3)=='57edf4a22be3c955ac49da2e2107b67a')
end

--md5.dochecks()
--print(md5.Calc('abc')) --900150983cd24fb0d6963f7d28e17f72
--print(md5.Calc('luis')) --502ff82f7f1f8218dd41201fe4353687

sexta-feira, 24 de outubro de 2008

Formatos de imagens

Abaixo segue uma relação de informações sobre alguns formatos de imagens. Dos formatos apresentados abaixo o jpeg e o png talvez sejam os que apresentam as maiores vantagens, mas cada situação exige um formato que atende melhor as necessidades (tamanho, qualidade, etc).

JPEG

Seu nome vem do grupo que definiu o formato, Join Photographic Experts Group. Normalmente este tipo de arquivo tem a extensão jpg. O arquivo é comprimido e codificado com todas as cores, assim este formato é eficiente para fotografias e outras imagens que possuem muitas cores.

A desvantagem é que ele usa um tipo de compressão que provoca uma perda de qualidade a cada modificação do arquivo e regravação no disco. Isto é conhecido como lossy. Então, não use JPEG se você pretende editar o arquivo várias vezes. Esta perda de qualidade não acontece quando você apenas copia o arquivo de um lugar para o outro, só quando há alguma modificação a nível de edição do arquivo.

GIF

O GIF, Graphics Interchange Format, é um formato indexado. Isto significa que ele usa uma lista de cores em vez de codificar cada cor separadamente. Este formato é muito eficiente para imagens com poucas cores, como o logotipo de uma empresa com apenas cinco cores.

GIF pode representar no máximo 256 cores. Como 256 é igual a 2 elevado a 8, este tipo de imagem também é conhecido como 8-bit color. Normalemente as fotografias tem muito mais que 256 cores, assim salvar uma fotografica como GIF produzirá um arquivo com baixa qualidade. Apesar disso o arquivo GIF ficará muito maior que a versão JPEG da mesma imagem. Conclusão: não use GIF para fotos, apenas para ícones e logotipos.

O formato GIF oferece dois recursos úteis: transparência e animação. Com a transparência você pode criar um ícone cujo fundo é completamente transparente e isto é útil em páginas web ou em botões de interfaces gráficas. GIF não trabalha com transparência parcial; o pixel é completamente transparente ou completamente opaco.

O recurso da animação permite a criação de GIFs animados, que são muito usados em páginas web.

PNG

Pronunciado "ping", seu nome vem de PNG's Not Gif (PNG não é GIF), embora hoje em dia também usem Portable Network Graphics como significado da sigla. É um formato relativamente novo cuja intenção inicial era ser um substituto do GIF devido a problemas legais, normalmente de copyright do formato GIF.

PNG pode ser usado para imagens com muitas cores, como JPEG, ou com imagens indexadas, como GIF. Quando trabalhando com imagens com muitas cores ele não é tão eficiente quanto o JPEG; a versão PNG de uma imagem será bem maior que sua versão JPEG. Porém PNG não trabalha com lossy: se você editar um arquivo PNG e salvá-lo, a qualidade será a mesma. Isto torna o formato PNG ideal para guardar imagens com muitas cores que serão editadas posteriormente.

Imagens PNG indexadas com poucas cores, como ícones e logotipos, são tão boas ou até melhores que as versões GIF e podem suportar mais que 256 cores. A maioria dos navegadores suportam PNG, assim é seguro usar imagens PNG em suas páginas de internet. PNG suporta transparência, inclusive transparência parcial. Assim, você pode criar áreas translúcidas. Porém, alguns navegadores não suportam a transparência PNG, neste caso suas imagens podem não ser exibidas corretamente.

PNG não suporta animação. Existe um formato chamado MNG que adiciona animação a uma imagem PNG mas, ainda não é suportado por nenhum navegador. Para imagens animadas, GIF ainda é a melhor opção.

XCF

Este é o formato do GIMP (um eficiente progama para manipulação de imagens). Quando você estiver editando uma imagem com muitas camadas (layers) e configurações, este é o formato ideal a ser usado. Arquivos XCF são muito grandes e só podem ser lidos pelo GIMP. Você pode comprimir os arquivo usando o GZIP ou o BZIP2 (arquivo.xcf.gz ou arquivo.xcf.bz2) e o GIMP manipulará a compressão quando ler ou gravar o arquivo.

TIFF

A sigla vem de Tagged Image File Format e sua extensão pode ser .tif ou .tiff. Este é outro formato a ser usado com imagens de muitas cores. Ele também não trabalha com lossy. Como o PNG, este formato não produz arquivos tão pequenos mas, pode ser usado para guardar imagens que serão editadas futuramente. Não use este tipo de arquivo em páginas web, pois muitos navegadores podem não exibir corretamente. Apesar da semelhança com o formato PNG, o formato TIFF não possui um padrão único, mas sim diferentes padrões com diferentes interpretações. Isto significa que um arquivo TIFF escrito por um programa pode não ser lido em outro. Por isso é altemente recomendado o uso de PNG em vez de TIFF.

Uma vantagem do TIFF é que ele manipula um maior número de cores (16 bits para cada canal de cor). Isto é importante para alguns profissionais como designers e artistas gráficos.

RAW

Não necessariamente um formato, RAW é um termo que abrange todos os formatos usados por fabricantes de câmeras. O suporte a alguns destes formatos acontece através do uso de plug-ins; outros são mantidos "em segredo" pelos fabricantes. Neste último caso, sua única opção é usar algum programa para converter a imagem antes de editá-la.

BMP

Este é o formato de bitmap da Microsoft. Arquivos BMP são muito grandes e não apresentam nenhuma vantagem em comparação com os formatos PNG ou TIFF. Salve em BMP se realmente for necessário, como por exemplo ao criar um ícone para o Windows. Caso contrário é melhor escolher outro formato.

PCD

Este é o formato proprietário Photo CD da Kodac. Ele inclui muitas resoluções dentro de um arquivo e por isso os arquivos tendem a ser muito grandes. Existe plug-in para ler arquivos PCD, mas uma melhor opção é converter o arquivo PCD para outro formato.

PSD

Este é o formato proprietário Photoshop da Adobe. Ele salva camadas e outras informações da mesma maneira que o XCF faz no GIMP. Na verdade existem dois formatos PSD, a versão mais nova é um padrão fechado que não pode ser lido por qualquer outro programa além do próprio Photoshop.

ICO

Este é o formato para ícones do Windows. Ele pode conter várias resoluções num arquivo. Este formato é útil não só para ícones do Windows, mas também para criar favicons para seu site web. Este tipo de ícone é aquele mostrado à esquerda do endereço do seu site na barra de endereços do navegador ou à esquerda do nome do site quando este é adicionado aos favoritos. A exibição do favicon depende do navegador. Nem todos os exibem o favicon nas duas posições.

PDF e PostScript

Estes são formatos gráficos vetoriais e não rasterizados (que utilizam pixels) como os outros formatos abordados até agora. Em vez de representar a imagem como uma coleção de pixels, utilizam uma imagem vetorial, que é uma coleção de instruções de desenho envolvendo pontos, linhas e curvas. Se você planeja salvar sua imagem como PostScrip ou PDF é melhor usar um programa que edite imagens vetoriais.

SVG

A sigla vem de Scalable Vector Graphics. Este formato vem crescendo em popularidade na web.


Para manipulação de imagens recomento o GIMP (GNU Image Manipulation Program) que é um software livre, possui versões para windows e linux, e é compátivel com vários formatos de imagens.


quarta-feira, 22 de outubro de 2008

Desafio lógico matemático

Para quem gosta de desafio lógico-matemático:

Qual é o sexto número?

1, 2, 6, 42,1806, ___ ???

...

Resposta:

Tente resolver antes de continuar a ler esta resposta.

O resultado é a multiplicação do número anterior(1806) por ele mesmo mais 1 (1806+1), ou seja, 1806*1807=3263442.

terça-feira, 14 de outubro de 2008

Exemplo de programa em Lua

-- Classe(tabela) Pessoa com variaveis inicializadas.
local Pessoa = {nome = 'João', idade = 30, nacionalidade = 'brasileira'}

-- Construtor de Pessoa.
function Pessoa:new(pessoa)
pessoa = pessoa or {}
pessoa.nome = pessoa.nome or self.nome
pessoa.idade = pessoa.idade or self.idade
pessoa.nacionalidade = pessoa.nacionalidade or self.nacionalidade
setmetatable(pessoa, self) ; self.__index = self
return pessoa
end

-- Criando dois objetos de Pessoa usando o construtor,
-- o primeiro sem passagem de parametro para o construtor
-- e o segundo com passagem de parâmetros.
local cliente = Pessoa:new()

local fornecedor = Pessoa:new{nome = 'Luis', idade = 21}

-- Criando um objeto similar mas sem usar a classe.
local funcionario = {nome = 'Robert', nacionalidade = 'americana',
idade = 42, cargo = 'gerente',
filho = {
{nome = 'Fernando', idade = 18, nacionalidade = 'mexicana'},
{nome = 'Mônica', idade = 13, nacionalidade = 'japonesa'}
}
}

-- Criando um cachorro, nao e uma pessoa mas possui
-- alguns atributos iguais.
local cachorro = {dono = 'Fernando', nome = 'Rex', idade = '5',
nacionalidade = 'brasileira'}

-- Tabela sociedade vai armazenar todas as pessoas e o cachorro.
local sociedade = {fornecedor, funcionario, cliente, funcionario.filho[1],
funcionario.filho[2], cachorro}

-- Imprime dados dos objetos(tabelas) criados. Observe que
-- este metodo tambem e usado para apresentar as informacoes
-- do cachorro, que apesar de nao ser uma pessoa, possui
-- todos os atributos tratados neste metodo.
function showPessoa(pessoa)
print('--------------------------------------')
print('Nome: '..pessoa.nome)
print('Idade: '..pessoa.idade)
print('Nacionalidade: '..pessoa.nacionalidade)
end

function initialize() -- Varre a tabela sociedade.
for i=1, table.getn(sociedade), 1 do
showPessoa(sociedade[i])
end
end

initialize() -- Inicia a aplicação.

-- Lua e uma linguagem orientada a tabelas. Tabela e o termo
-- mais correto para os “objetos” criados nesta aplicação.
-- Todas as informacoes em uma tabela sao indexadas e
-- facilmente manipuladas.

segunda-feira, 22 de setembro de 2008

Convertendo String para Date em java

Exemplo que mostra como converter uma String para Date em java:

import java.util.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Data {

public static void main(String[] args) {
DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
Date data = null;
try {
data = new Date(fmt.parse("05/08/1987").getTime());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(data);
}
}

quarta-feira, 10 de setembro de 2008

Concatenando Strings em Lua

Para concatenar Strings em Lua usamos o operador ..

Exemplo:

local string1 = 'Hello '
local string2 = 'World'
local stringConcatenada = string1..string2
print(stringConcatenada)

Pegando o tamanho de uma String em Lua

Para sabermos o tamanho de uma String em script Lua usamos o string.len(stringParametro) passando a String desejada como parâmetro e recebendo de retorno seu tamanho.

Exemplo:

local str = 'stringTeste'
local tamanho = string.len(str)
print(tamanho)