Sistema de Ponto On Line

A tempos venho escrevendo software pra todo mundo, vários freelas e empresas que já passei, e raramente, tenho a oportunidade/idéia de escrever um software um pouco mais robusto por necessidade própria. Geralmente, escrevo pequenos scripts em PHP-Cli ou Bash mesmo, para automatizar pequenas tarefas, como armazenamento de senhas pessoais, todo list, ponto e etc.

Mas dessa vez foi diferente, como dito a pouco, eu tinha um pequeno script em php-cli, onde registrava meus horários de entrada e saída na empresa que trabalho atualmente. Algo despretensioso, apenas registrava a entrada, saída e me dizia um total de horas, coisa bem simples e totalmente mono usuário. Sempre usei por vontade própria, e para atender somente a minha necessidade de saber se estou cumprindo corretamente meus horários e etc.

Sempre quis fazer uma versão web do script, para poder utilizar nas empresas que passei - acredite, ainda existem empresas que usam o velho cartão ponto, escrito a caneta e fazendo a pobre da secretária executar mil cálculos no final de todo mês - mas nunca me davam a oportunidade de alocar algumas horas para fazê-lo - as empresas sempre cortam nosso barato quando queremos nos divertir.

Então, em uma madrugada, trabalhando encima do projeto de um cliente, me veio um estalo: “- ei, a tempos quero fazer uma interface totalmente em Javascript, mas não posso fazer isso para um cliente, seria muito trabalhoso e não compensaria o esforço.”

Dessa necessidade, nasce o Ponto, um pequeno sistema de Ponto Eletrônico, dessa vez, multi-usuário e muito prático de se utilizar, atendendo perfeitamente a necessidade de pequenas empresas.

A idéia principal - além de atender a minha própria necessidade -, como disse, era poder brincar a vontade com Javascript, mais especificamente, a dupla jQuery + jQuery UI e HTML 5 pra ver no que daria.

Meu foco era o seguinte:

  • escrever o mínimo possível de código HTML, apenas o necessário para carregar o projeto, o resto deveria ser gerado dinamicamente pela aplicação.
  • escrever o mínimo possível de CSS, deixando ao máximo a questão de interface a cargo do jQuery UI.
  • utilizar alguns recursos do HTML 5, como Session Storage.
  • brincar bastante com Javascript :)
  • brincar bastante com SQLite \o/
  • brincar com as “Google Chart Tools

A aplicação é simples e contém os seguintes recursos:

  • cadastro simples
  • cadastro de sub-usuários
  • relatório mensal
  • gráficos de média de assiduidade, cumprimento de  horas diárias e mensal, cumprimento da meta de horas mensais.
  • configuração dos dias da semana em que são trabalhados
  • utilização da sessão do sub-usuário - acho que só quem gosta disso são os chefes.

A base de dados fica armazenada na máquina em que foi aberto o projeto (tanto faz se você jogou em um servidor web ou abriu o arquivo html), e isso quem trata é o próprio navegador. Então, se for utilizar em uma empresa, aconselho a todos os usuários baterem ponto na mesma máquina ;) E por falar em navegador, por enquanto, é compatível apenas com o Google Chrome, pois foi o único que implementou até agora a base de dados interna utilizando SQLite.

Gostou? O código fonte você pode baixar direto da minha página no GitHub ou utilizar a versão de demonstração direto daqui.

Em tempo ainda, se você quiser dar uma conferida no banco que foi criado, basta ter o executável do SQLite3, o banco está num dos caminhos abaixo, dependendo do seu SO: Windows Vista or 7: \Users_username_\AppData\Local\Google\Chrome\User Data\Default\databases Windows XP: \Documents and Settings_username_\Local Settings\Application Data\Google\Chrome\User Data\Default\databases Mac OS X: ~/Library/Application Support/Google/Chrome/Default/databases Linux: ~/.config/google-chrome/Default/databases

Espero que seja útil pra você, quanto é pra mim :)

PHP 5 - Trabalhando com Arquivos e Diretórios com classe

Uma das features mais legais do PHP 5 são os chamados Iterators, tem pra tudo, array, diretórios, XM … dando uma olhada na página do manual, você pode ter uma listagem completa, inclusive com exemplos de uso. Futuramente, pretendo falar sobre todos, mas a bola da vez é o DirectoryInterator.

O DirectoryIterator, é obviamente, para trabalhar com diretórios e arquivos. Com ele, você pode facilmente - e obviamente, orientado a objetos - trabalhar com o conteúdo de um diretório.

Um exemplo de uso: <?php // diretório atual do script $strDiretorio = DIR;

// instancio a classe informando o diretório $objDiretorio = new DirectoryIterator($strDiretorio);

// percorro o conteúdo do diretório foreach($objDiretorio as $objDiretorioConteudo) {     echo $objDiretorioConteudo->getPathname() . PHP_EOL; } ?>

Abaixo, listo alguns métodos que você pode usar no $objDiretorioConteudo do exemplo acima:

Pegar a data de modificação: getMTime() Pegar a data de criação: getCTime() Verficiar se é um diretório: isDir() Verificar se é um arquivo: isFile() Verificar se é um arquivo oculto (começa com ponto, no Linux): isDot() Verificar se é um link: isLink() Verificar as permissões: getPerms() Recuperar o tamanho do arquivo: getSize() Verificar se é um executável: isExecutable() Verificar se existe a permissão de leitura: isReadable() Verificar se existe a permissão de gravação: isWritable()

Na página do manual, você pode obter uma listagem completa dos métodos, dá uma passada lá.

Otimizando o consumo de memória do NetBeans

Outro dia, aborrecido com o alto consumo de memória do NetBeans no meu Netbook, resolvi procurar informações a respeito de otimizações (sim, eu sou um baita fominha quando se trata de espaço em disco e memória, acho que culpa de sempre ter usado máquinas podreiras). De tanto fuçar, acabei chegando na seguinte configuração para o meu netbeans.conf - no Ubuntu, ele fica em /usr/local/netbeans-*/etc/:

netbeans_default_options="-J-client -J-Xss2m -J-Xms128m -J-Xmx256m -J-XX:PermSize=128m -J-XX:MaxPermSize=1000m -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled -J-Dnetbeans.logger.console=true -J-ea -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-da -J-Djava.net.preferIPv4Stack=true -Dsun.java2d.d3d=false -Dawt.nativeDoubleBuffering=true"

Os parâmetros acima são meio que auto-explicativos, mas em resumo, estou dizendo para o NetBeans:

  • usar por padrão o IPv4 (caso tenha problemas em fazer atualizações dos plugins, eu tive algumas vezes)
  • Esconder a janela irritante de Exceções do Java (comigo aconteceu muito na versão beta 2 do 7)
  • Usar o buffer dpulo nativo
  • Iniciar com 128Mb de reserva pra cache e etc e no máximo 1Gb para uso.

Bom, o resto você procurar né?

ps: Você também pode acrescentar: “–laf javax.swing.plaf.metal.MetalLookAndFeel” caso não queria usar o padrão GTK que ele põe, existem outros, basta procurar, pq no momento em que escrevo isso não me lembro dos outros :P