Quando desenvolvemos uma aplicação sem o conhecimento da linguagem e metodologia utilizada ou sem um conhecimento básico de sistemas operacionais, carga de memória, algorítmos ou o que o processador irá fazer com um determinado trecho do seu código, podem surgir aplicativos que não são escaláveis e quando a demanda aumentar, você terá que refatorar seu código e possivelmente reescrever boa parte de seu aplicativo.
Para exemplificar, imagine que você necessite desenvolver uma solução que abra um arquivo no formato TXT de 60.000 linhas, procure por linhas que contenham a string "192.168.1.20" e escreva estas linhas em um novo arquivo:
public class AplicativoTXT {
public static void main(String[] args) {
File log = new File("access.log");
File nov = new File("access.log.bkp");
if (log.exists()) {
try {
String conteudo = "";
FileReader reader = new FileReader(log.getPath());
BufferedReader leitor = new BufferedReader(reader);
String linha;
int contador = 1;
while ((linha = leitor.readLine()) != null) {
if (linha.contains("192.168.1.20")){
conteudo += linha;
}
contador++;
}
BufferedWriter wr=new BufferedWriter(new FileWriter(nov));
writer.wr(conteudo);
wr.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
}
Ok, este código cumpre com sua função de varrer um aquivo txt, encontrar linhas que contenha uma determinada string, separá-las em uma string denominada "conteudo" e então, através de um BufferedWriter, salvar o conteúdo no arquivo.
Agora entra a parte do conhecimento técnico da linguagem e de algorítimos de computação: Ao executar este código com um arquivo TXT com 60.000 linhas, ele com certeza levará mais de 15 minutos de execução se ele não apresentar uma StackOverflowError na tela por causa do consumo excessivo de memória e simplesmente não concluir a execução do código. Um desenvolvedor inexperiente ou que nunca passou pela necessidade de escalabilidade de seu aplicativo, certamente não notará a deficiência que esse código pode trazer.
Em java, a classe String é imutável, ou seja, ao concatenar um objeto do tipo String, é alocado na memória mais uma nova intância de String, e a variável deixa de apontar para o valor antigo e aponta para o novo valor, mantendo o valor antigo alocado na memória. O Garbage collector recolhe o lixo, mas não é garantido quando, isso pode saturar a memória, pois a cada loop, o tamanho necessário a ser alocado, aumenta, trazendo também lentidão ao processamento com essa brincadeira de alocar espaços na memória.
Para resolver este problema, criaram as classes StringBuilder e StringBuffer. Basicamente elas são Strings mutáveis. Ao invés de substituir ou concatenar o valor da variável, com o StringBuilder, simplesmente é chamado o métido .append(String) para concatenar um valor a variável. Foi colocado no projeto destas classes, métodos responsáveis pela alteração e modificação do conteúdo interno, sem que necessariamente um novo objeto seja criado. O algorítimo criado para esta realização foi desenvolvido para ser extremamente rápido, segundo diz o livro Effective Java, cerca de 9 vezes mais rápido para um bloco de 800 caracteres.
O código com a utilização do StringBuilder ficaria da seguinte maneira:
public class AplicativoTXT {
public static void main(String[] args) {
File log = new File("access.log");
File nov = new File("access_filtrado.log");
if (log.exists()) {
try {
StringBuilder conteudo = new StringBuilder();
FileReader reader = new FileReader(log.getPath());
BufferedReader leitor = new BufferedReader(reader);
String linha;
int contador = 1;
while ((linha = leitor.readLine()) != null) {
if (linha.contains("192.168.1.20")){
conteudo.append(linha);
conteudo.append("\n");
}
contador++;
}
BufferedWriter wr=new BufferedWriter(new FileWriter(nov));
writer.wr(conteudo.toString());
wr.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
}
Assista o vídeo oficial e confira o que o Gmail pode fazer por você.
Mas afinal, se não se questionou deste jeito, com certeza já pensou em transformar a URL de seus projetos php de forma que não mostre valores e variáveis.
Um bom exemplo:
- Antes: www.endereco.com/?pagina=noticias&idnoticia=4
- Depois: www.endereco.com/noticias/4/como-fazer-isso
Então eles decidiram por adotar uma configuração modularizada, onde os parâmetros gerais do servidor ficam em "apache2.conf" e as configurações válidas para os sites virtuais ficam em arquivos de configuração sob a pasta /etc/apache2/sites-available/ e é la onde você deverá definir o parâmetro AllowOverride com o valor All conforme veremos logo abaixo.
O arquivo httpd.conf continua existindo por questões de retro-compatibilidade, ele é fornecido vazio, mas, se vc colocar alguma diretiva nele o sistema continuará respeitando-a...
Voltando a falar sobre a configuração necessária para utilização de URLs amigáveis, algumas configurações são necessárias no httpd.conf.
Abra o arquivo httpd.conf e descomente a seguinte linha (remover a tralha no ínicio da linha):
#LoadModule rewrite_module modules/mod_rewrite.so
Caso utilize Debian siga os passos:
Se fosse realizar os passos manualmente, seriam necessários alterações e criações de novos arquivos. Para resolver este problema e cortar um bom caminho, existe um comando facilitador que habilita um módulo no apache. Execute o comando: a2enmod rewrite. Ele cria um arquivo na pasta /etc/apache2/mods-enabled chamado rewrite.load no qual contem a linha LoadModule citada acima.
O proximo passo é alterar as seguintes linhas do http.conf:
#
# Options Indexes FollowSymLinks
# AllowOverride None
#
por:
Options FollowSymLinks Includes
AllowOverride All
Caso utilize Debian, essas linhas não estarão presentes no arquivo apache2.conf. As premissões de diretórios e sites virtuais, como dito anteriormente, se localiza em /etc/apache2/sites-available/. Acesse esta pasta e edite o arquivo default, caso não tenha um site configurado nesta pasta, este é o arquivo de configuração padrão para todos os sites. Altere todos os parâmetros AllowOverride deste aquivo, para o valor All.
A permissão para utilizar .htaccess em pastas para alterar as permissões de acesso, já está realizada. Vamos então criar um arquivo chamado .htaccess na pasta em que desejamos tal efeito com o seguinte conteúdo:
RewriteEngine on
RewriteRule !\.(js|ico|txt|gif|jpg|png|css|swf)$ pagina.php
Este comando habilita o Módulo Rewrite e cria uma regra que redireciona para o quivo pagina.php quando o arquivo for diferente das extensões citadas: .js, .ico, .txt, .gif, .jpg, .png, .css, .swf. Se este arquivo estiver dentro da pasta "teste" (http://localhost/teste), por exemplo, qualquer endereço que aponte para dentro desta pasta será redirecionado para o arquivo PAGINA.PHP conforme configuração do .htaccess. Por exemplo: http://localhost/teste/noticia/31/teste-de-noticia.
Como fazer agora para capturar os parâmetros passados no arquivo pagina.php?
Usando a função explode para quebrar a variável do servidor que aponta para o endereço digitado ($_SERVER["REQUEST_URI"]) da seguinte maneira:
$get = explode("/", $_SERVER["REQUEST_URI"]);
todos os valores estão agora no vetor $get, basta utilizálos.
Se este arquivo .htaccess estiver dentro da pasta "teste" por exemplo (http://,
Ao instalá-lo pelo comando:
aptitude install phpmyadmin ou apt-get install phpmyadmin
Os arquivos php para acesso via apache serão colocados na pasta /usr/share/phpmyadmin, sendo que a pasta comum de www do Apache fica em /var/www.
Para resolver isto de forma simples e sem precisar alterar a configuração do apache para apontar para a pasta /usr/share/phpmyadmin, simplesmente copie através do Terminal desta maneira:
cp -r /usr/share/phpmyadmin/ /var/www/phpmyadmin
Por onde começar a análise do sistema e a modelagem do banco de dados?
O primeiro passo realmente é passar a idéia abstrata do desenvolvimento para o papel, ou para um arquivo de texto, criando um texto descritivo onde constará todo processo do negócio, ou seja, a regra de negócio. Esse texto é denominado como “mini-mundo”. Com isso, você poderá enxergar as tabelas e relacionamentos existentes para a modelagem.
Após a criação do mini-mundo, é preciso ter cuidado para criar cada tabela e cada relacionamento, formando o DER (diagrama de entidade e relacionamento) e para isso, eu costumo utilizar o bom e velho papel, onde você pode com mais facilidade apagar, recriar, rabiscar e amassar.
Depois disso, tenha em mente toda funcionalidade que o sistema precisará possuir e comece a criar “rotas” dentro do seu MER e verifique se elas são válidas, fazendo assim uma espécie de prova real para testar se seu diagrama está mesmo obedecendo aquilo o que você necessita.
Agora é necessário passar o seu rabisco para o computador, mais especificamente criar um banco de dados. Atualmente tenho usado um software chamado Enterprise Architect para criar as tabelas do banco de dados de forma visual. O mais interessante é que com ele você poderá gerar as tabelas, chaves primárias e estrangeiras, e convertê-las para um bom acervo de gerenciadores de banco de dados, como MySQL, Postgrees, SQL Server entre outros. Ele ainda conta com a vantagem de converter as tabelas em classes de entidade em outros tantos de linguagens, criar diagramas UML e muito mais. É uma excelente ferramenta para criação da documentação completa de seu projeto.
Existe alguma solução para gerenciar projetos on-line?
Descobri a alguns dias um sistema on-line produzido por um casal que havia a necessidade de gerenciar seus projetos, já que ele era desenvolvedor e ela designer.
O site chama-se ClockingIT e ele dispõem de grandes recursos para gerência de projetos, com prazos, metas e equipes. Ao criar seu grupo, você poderá ainda adicionar mais pessoas para a utilização em conjunto daquele domínio de trabalho, dando permissões e atribuindo tarefas. Possui também ferramentas com geração de gráficos e lembretes enviados via e-mail.
A grande desvantagem é ser um software on-line com código fechado e restrito a uso no servidor deles. Mas acho que pela extensão do projeto e pelo fato de que muitas empresas devem estar usufruindo deste sistema, não acho que devem fechar as portas de uma hora para outra, já que a tendência e o objetivo é crescer e se desenvolver novas ferramentas junto com as que já existem. Vale a pena conferir, visto que a produtividade em um projeto está totalmente relacionada com a organização de atividades e metas atingidas.
Autor
Meu nome é Thiago e este é meu blog. Gosto e trabalho com desenvolvimento de sistemas, criando softwares para área médica e tecnológica. Tenho muito ainda o que aprender, continuo buscando conhecimento. Neste espaço você encontrá meus trabalhos e um diário de um computólogo. |
Pesquisa
Marcadores
- apache (1)
- desenvolvimento (2)
- Eu valorizo a internet (3)
- internet (3)
- java (2)
- jsf (1)
- modelagem de dados (1)
- navegação (2)
- php (1)
- profissão java (1)
- projetos (1)
- richfaces (1)
- software (1)
- trabalho (3)
- ZendFramework (1)
Arquivos do Blog
Anúncios
Busca Interna
© Copyright Falha Mecânica 2.0. All rights reserved.
Designed by FTL Wordpress Themes | Bloggerized by FalconHive.com
brought to you by Smashing Magazine