By: Eduardo Almeida- 20/10/2011
Em: Server side, Ambientes & Linguagens - Comentários: 0 - Leituras: 317
Diferentemente do que muitos pensam, para se obter um software de qualidade, ser bom programador e dominar uma linguagem de programação não é o suficiente. Para criar softwares de qualidade é necessário muito mais do que um bom programador e uma boa linguagem de programação.
Inicialmente, todo sistema tem um propósito e uma necessidade de criação. Nenhum desenvolvedor ou empresa irá criar um software que não será usado por ninguém. Dessa forma um software sempre deverá ser criado para atender às necessidades de alguém. E essas necessidades podem e devem ser "traduzidas" em requisitos.
A análise e especificação de requisitos de um software consiste nas atividades de determinar os objetivos de um sistema de software e as restrições associadas a ele.
Esta análise também deve estabelecer o relacionamento entre estes objetivos e restrições e a especificação precisa do software
A maior parte dos problemas no desenvolvimento de software são originados nas etapas iniciais do desenvolvimento justamente na etapa de levantamento e definição dos requisitos do sistema onde as principais atividades são:
Havendo falhas na realização em uma dessas atividades, haverá inconsistência nos documentos de requisitos e o que acarretará um software de baixa qualidade com um custo elevado.
Os requisitos expressam as características e restrições do produto de software do ponto de vista de satisfação das necessidades do usuário, e, em geral independem da tecnologia empregada na construção da solução sendo a parte mais crítica e propensa a erros no desenvolvimento de software.
Requisitos são objetivos ou restrições estabelecidas por clientes e usuários do sistema que definem as diversas propriedades do sistema. Os requisitos de software são, obviamente, aqueles dentre os requisitos de sistema que dizem respeito a propriedades do software.
Um conjunto de requisitos pode ser definido como uma condição ou capacidade necessárias que o software deve possuir:
Na maioria dos casos, os requisitos de software são separados em requisitos funcionais e não-funcionais.
Os requisitos funcionais são a descrição das diversas funções que clientes e usuários querem ou precisam que o software faça. Eles definem a funcionalidade desejada do software.
O termo função é usado no sentido genérico de operação que pode ser realizada pelo sistema, seja através comandos dos usuários ou seja pela ocorrência de eventos internos ou externos ao sistema.
A especificação de um requisito funcional deve determinar o que se espera que o software faça, sem a preocupação de como ele faz.
É importante diferenciar a atividade de especificar requisitos da atividade de especificação que ocorre durante o design do software.
No design do software deve-se tomar a decisão de quais a funções o sistema efetivamente terá para satisfazer àquilo que os usuários querem.
Requisitos não-funcionais são as qualidades globais de um software, como:
Normalmente estes requisitos são descritos de maneira informal, de maneira controversa (por exemplo, o gerente que segurança mas os usuários querem facilidade de uso) e são difíceis de validar.
A necessidade de se estabelecer os requisitos de maneira de forma precisa é crítica na medida que o tamanho e a complexidade do software aumentam. Os requisitos exercem influência uns sobre os outros.
Por exemplo, o requisito portabilidade, que muitas vezes faz o desenvovedor achar que deve usar Java para desenvolver, acaba influenciando diretamente no requisito "ser rápido". Softwares em java geralmente são "pesados".
De acordo com Farley, um documento de especificação de requisitos deve possui as seguintes seções:
Construir um sistema de software com base em requisitos inconsistentes e mal discriminados é como construir um edifício sem vigas.
Referências :
http://www.dimap.ufrn.br/~jair/ES/es99c3.html - Jair C Leite, 1999
By: Eduardo Almeida- 13/10/2011
Em: Client side, Ambientes & Linguagens - Comentários: 2 - Leituras: 251
Após fazer algumas abordagens mais simples à alguns conceitos de Orientação a Objeto em Javascript, hoje irei ensinar como trabalhar com namespaces.
Registrar um namespace em javascript, pode ser feito de várias formas possíveis, porém inicialmente irei abordar a forma, que no meu ponto de vista, é a mais fácil e prática.
Para registrar um namespace, basta criar uma variável atribuindo ela à ela mesmo e usando o operador lógico || e logo após {} que definirá a variável como um objeto caso ela esteja indefinida.
//Namespace Carros
var Carros = Carros || {};
Carros.quantidade = 3;
alert(Carros.quantidade); // mostrará na tela o valor 3
Agora que temos o namespace "Carros" criado, vamos fazer uma abordagem um pouco mais complexa ao objeto criando "sub" namespaces. Vejamos o exemplo:
//Namespace HondaCivic
Carros.HondaCivic = {};
Carros.HondaCivic.ano = 2011;
Carros.HondaCivic.cor = "preto";
//Namespace Camaro
Carros.Camaro = {};
Carros.Camaro.ano = 2010;
Carros.Camaro.cor = "amarelo";
//Namespace AudiTT
Carros.AudiTT = {};
Carros.AudiTT.ano = 2010;
Carros.AudiTT.cor = "cinza";
alert(Carros.HondaCivic.cor); // mostrará na tela o valor preto
alert(Carros.HondaCivic.ano); // mostrará na tela o valor 2011
function regNS(ns)
{
var nameSpaces = ns.split(".");
var raiz = window;
for(var i=0; i < nameSpaces.length; i )
{
if(typeof raiz[nameSpaces[i]] == "undefined")
raiz[nameSpaces[i]] = new Object();
raiz = raiz[nameSpaces[i]];
}
}
Para demonstrar o quanto o Javascript é flexível, vou fazer uma demonstração utlizando duas abordagens diferentes de de criar namespaces.
Primeiro, irei criar o namespace Carros conforme no início deste post
//Namespace Carros
var Carros = Carros || {};
Carros.quantidade = 3;
Depois, irei criar o namespace Casa.Garagem utilizando a função regNS que criamos acima
regNS("Casa.Garagem");
No final, podemos simular herança, atribuindo o namespace Carros ao namespace Casa.Garagem.Carros
Casa.Garagem.Carros = Carros; alert(Casa.Garagem.Carros.quantidade); // mostrará na tela o valor 3
By: Eduardo Almeida- 18/7/2011
Em: Server side, Ambientes & Linguagens - Comentários: 2 - Leituras: 2883
Após alguns dias envolvidos com projetos importantes e sem poder postar no blog, resolvi escrever um post bacana que retratasse bem o poder do Perl usado dentro do ambiente ASP.
Eu pensei em diversos temas, como Crawlers ou algo que demontrasse o poder absurdo do Perl para manipulação de texto, mas acabei escolhendo uma temática bem exótica se levada em consideração a cultura ASP tradicional, o tema escolhido foi: Port Scan.
Por que exótico? Basta se responder: quantos port scan rodando em arquivos ASP você ja viu?
Bom, antes de entrar na parte técnica, há alguns pontos que os "marujos" de plantão deveriam saber:
Todo port scan é baseado no uso de sockets. Atravé do sockets é que podemos nos "conectar" a outro computador na "porta X" e testarmos se ela está aberta ou fechada.
Um port scan para ser produtivo, precisa ter algumas features básicas como entrada de intervalos de porta a serem testadas bem como o uso de arquivos contendo host e portas a serem testadas. E assim foi feito.
Vamos ao código:
Arquivo: port_scan.aspl
< % @ LANGUAGE = " PerlScript " CODEPAGE = "65001 " % >
< %
use strict;
use warnings 'all';
use Win32::ASP;
use IO::Socket;
use base 'ASP4::FormHandler';
use vars __ PACKAGE __ - >VARS;
$Response->{Buffer} = 1;
$Server->{ScriptTimeout} = 99999999999999;
$Response->{CodePage} = 65001;
$Response->{charset}="utf-8";
my $versao = "v1.0";
my $host;
my $porta;
my $porta1;
my $porta2;
my $socket;
my $abre;
my @portas_abertas;
my @portas;
my @comandos;
my $count;
my $auto;
my $s;
my $p;
my $all;
my $f;
my $c;
my $r;
my $l;
my $localdohost = $Request->QueryString("localdohost")->Item();
my $modo = $Request->QueryString("modo")->Item();
my $portadeinicio = $Request->QueryString("portadeinicio")->Item();
my $portafinal = $Request->QueryString("portafinal")->Item();
#==>>> inicia programa
start();
@comandos[0] = $localdohost;
@comandos[1] = $modo;
@comandos[2] = $portadeinicio;
@comandos[3] = $portafinal;
if((@comandos[0] eq "") || (@comandos[1] eq ""))
{
print "Parâmetros incompletos
";
forma_de_uso();
}
$host = @comandos[0];
seta_variaveis();
#==>>> inicia programa
sub start
{
$host = "";
$porta1 = 0;
$porta2 = 0;
$porta = 0;
$socket;
$abre = "";
@portas_abertas = "";
@portas = "";
@comandos = "";
$count = 0;
$auto = "";
$s = 0;
$p = 0;
$all = 0;
$f = "";
$c = 0;
$r = 0;
$l = "";
}
sub forma_de_uso
{
print "
-==============================-==============================-=-
";
print " ASPL Portscan $versao
";
print "Forma de uso:
";
print "
port_scan.aspl?localdohost=HOST&modo=-s&portadeinicio=NUMEROPORTAINICIAL&portafinal=NUMEROPORTAFINAL
";
print "
port_scan.aspl?localdohost=HOST&modo=-p&portadeinicio=NUMEROPORTA
";
print "-==============================-==============================-=-
";
exit;
}
sub seta_variaveis
{
if(@comandos[0] eq "-a")
{
if($auto ne "")
{
print "Impossível automatizar o scan automatizado!
";
forma_de_uso();
}
if(@comandos[1] eq "")
{
print "Faltando parâmetro!
";
forma_de_uso();
}
$auto = @comandos[1];
automatizado();
}
if($auto ne "")
{
$count = 2;
}
else
{
$count = 1;
}
while((@comandos[$count] ne "") && (@comandos[$count] ne "#"))
{
if (@comandos[$count] eq "-p")
{
if(($s eq 1) || ($p eq 1) || ($all eq 1) || ($l ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
if((@comandos[$count] eq "") || (@comandos[$count] < 1) || (@comandos[$count] > 65535))
{
print "Especificação de porta inválida!
";
forma_de_uso();
}
$porta1 = @comandos[$count];
$porta2 = @comandos[$count];
$count ;
$p = 1;
}
if(@comandos[$count] eq "-s")
{
if(($s eq 1) || ($p eq 1) || ($all eq 1) || ($l ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
$porta1 = @comandos[$count];
$count ;
$porta2 = @comandos[$count];
if(($porta1 < 1) || ($porta2 > 65535) || ($porta2 < $porta1))
{
print "Especificação de porta inválida!
";
forma_de_uso();
}
$count ;
$s = 1;
}
if(@comandos[$count] eq "-all")
{
if(($s eq 1) || ($p eq 1) || ($all eq 1) || ($l ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$porta1 = 1;
$porta2 = 65535;
$count ;
$all = 1;
}
if(@comandos[$count] eq "-c")
{
if($c eq 1)
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
$c = 1;
}
if(@comandos[$count] eq "-f")
{
if($f ne "")
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
$count ;
if(@comandos[$count] eq "")
{
print "Você não especificou o nome do arquivo!
";
forma_de_uso();
}
$f = @comandos[$count];
$count ;
}
if((@comandos[$count] ne "-f") && (@comandos[$count] ne "-s") && (@comandos[$count] ne "-p") && (@comandos[$count] ne "-c") && (@comandos[$count] ne "-f") && (@comandos[$count] ne "-r") && (@comandos[$count] ne "-l") && (@comandos[$count] ne "") && (@comandos[$count] ne "#"))
{
print "Escolha de comando inválida!: @comandos[$count]
";
forma_de_uso();
}
}
chomp($host);
chomp($porta1);
chomp($porta2);
chomp($f);
chomp($l);
scanneia();
}
sub automatizado
{
if((@comandos[2] ne "#") && (@comandos[2] ne ""))
{
print "Comando incompatível ou duplicado!
";
forma_de_uso();
}
open(a_arquivo, ")
{
$f = "";
$f = ;
#chomp($f);
@comandos=split(/ /, $f);
$f = "";
if(@comandos[0] ne "#")
{
start();
$host = @comandos[1];
seta_variaveis();
}
for($count = 0; scalar(@comandos) >= $count; $count )
{
pop @comandos;
}
}
close(a_arquivo);
}
sub scanneia
{
if($f ne "")
{
open(arquivo, ">$f") || die "Impossível abrir o arquivo! $!
"; #Linux
close(arquivo);
}
$porta = $porta1;
print "
Scanneando $host...
";
$Response->Flush;
if($f ne "")
{
print "salvando para o arquivo: $f
";
$Response->Flush;
}
print "==============================
";
print " ASPL Portscan $versao
";
print " Written by Eduardow
";
print "==============================
";
print "Port\t\tStatus
";
print "==============================
";
$Response->Flush;
for($porta = $porta1; $porta Flush;
}
$abre = eval
{
$socket = new IO::Socket::INET
(
PeerAddr => $host,
PeerPort => $porta,
Proto => getprotobyname('tcp') || 6
)
};
chomp($porta);
if ($abre)
{
if($c eq 1){print $porta;}
print "\t\tAberta ";
push @portas_abertas, $porta;
$Response->Flush;
}
else
{
if($c eq 0)
{
print "\t\tFechada
";
$Response->Flush;
}
}
if(defined($socket))
{
close($socket);
}
}
print "==============================
";
print "Resultado Final:
";
$Response->Flush;
my $abre_p = sort {$a$b;} @portas_abertas;
if(($s eq 1) || ($all eq 1))
{
print scalar(@portas_abertas)-1;
print " portas abertas entre as portas $porta1 e $porta2 no host $host
";
#if(scalar(@open) >= 1)
#{
print "Porta\t\tStaus
";
print "=-=-=\t\t=-=-=
";
$Response->Flush;
foreach $porta (@portas_abertas)
{
if($porta>0)
{
print "$porta\t\tAberta
";
$Response->Flush;
}
}
#}
}
if($p eq 1)
{
if(@portas_abertas[0] ne "")
{
print "Porta $porta1 está ABERTA no host $host
";
$Response->Flush;
}
else
{
print "Port $porta1 está FECHADA no host $host
";
$Response->Flush;
}
}
if($f ne "")
{
salva_arquivo();
}
print "
";
}
sub salva_arquivo
{
open(arquivo, ">$f") || die "Impossível abrir o arquivo! $!
";
print arquivo "==============================\n";
print arquivo " ASPL Portscan $versao\n";
print arquivo " Written by Eduardow\n";
print arquivo "==============================\n\n";
print arquivo "Host: $host\n";
if(($s eq 1) || ($all eq 1))
{
print arquivo "Portas scanneadas: $porta1 à $porta2\n\n";
print arquivo "Resultado final:\n\n";
print arquivo scalar(@portas_abertas);
print arquivo " portas abertas entre as portas $porta1 e $porta2 no host $host
";
print arquivo "Porta\t\tStatus\n";
print arquivo "=-=-=\t\t=-=-=\n";
foreach $porta (@portas_abertas)
{
print arquivo "$porta\t\tAberta\n";
}
}
if($p eq 1)
{
print arquivo "Porta scanneada: $porta1\n\n";
print arquivo "Resultado final:\n\n";
if(@portas_abertas[0] ne "")
{
print arquivo "Port $porta1 está FECHADA no host $host
";
}
else
{
print arquivo "Porta $porta1 está ABERTA no host $host
";
}
}
}
%>
Com apenas uma linha (abaixo divida em 4 para maior compreensão) em Perl, podemos testar a disponibilidade de uma porta.
$socket = new IO::Socket::INET
(
PeerAddr => $host,
PeerPort => $porta,
Proto => getprotobyname('tcp') || 6
)
Quem quiser testar o port scan feito em ASP e Perl, basta acessar : www.web2solutions.com.br/port_scan.aspl
Sinopse
port_scan.aspl?localdohost=HOST&modo=-s&portadeinicio=NUMEROPORTAINICIAL&portafinal=NUMEROPORTAFINAL
port_scan.aspl?localdohost=HOST&modo=-p&portadeinicio=NUMEROPORTA
By: Eduardo Almeida- 21/6/2011
Em: editorial, Ambientes & Linguagens - Comentários: 0 - Leituras: 2695
Essa é pro pessoal descontrair um pouco. Não levem pro lado pessoal, ahahahaha

By: Eduardo Almeida- 6/6/2011
Em: Client side, Ambientes & Linguagens - Comentários: 3 - Leituras: 3868
Boa noite pessoal, vamos dar continuidade ao nosso artigo de OO. Vou dar algumas dicas interessantes hoje!
Essa propriedade nos permite adicionar e, em alguns casos modificar, propriedades ou métodos do construtor após sua definição.
Poderemos adicionar propriedades durante a execução. Todo construtor javascript possui a propriedade function.prototype.
function animal()
{
};
// instancia-se o objeto
var cavalo = new animal;
//altera propriedades do construtor em tempo de execução
cavalo.prototype.orelhas = 2;
cavalo.prototype.olhos = 2;
alert(cavalo.olhos);// alerta 2
Esta propriedade não pode ser usada para sobrescrever nada que ja tenho sido definido no construtor. Uma dica é definir tudo no construtor ou fora do construto via function.prototype
Não há ainda suporte a encapsulamento no javascript, porém poderemos simular utilzando o escopo. Observem o exemplo:
function animal()
{
// propriedades públicas
this.orelhas = 2;
this.olhos = 2;
// propriedades privadas
var privada_variavel = "azul";
//método público
this.emitir_som = function(som) {
alert(som);
}
//método privado
var privado_metodo = function() {
alert();
}
};
var cavalo = new animal;
// le propriedade publica do objeto
alert(cavalo.olhos); // alerta -> 2
alert(cavalo.orelhas); // alerta -> 2
// le propriedade privada do objeto
alert(cavalo.privada_variavel); // alerta -> undefined
// invoca método público do objeto
cavalo.emitir_som("innhornhornhorn"); // alerta innhornhornhorn
// invoca método privado do objeto
cavalo.privado_metodo(); // retornará erro
By: Eduardo Almeida- 2/6/2011
Em: Client side, Ambientes & Linguagens - Comentários: 1 - Leituras: 921
O Javascript é de fato orientado à objetos, porém não possui nativamente diversas características desta prática. Originalmente não há herança, não há classes, não é possível acessar métodos públicos diretamente de fora do objeto, etc.
Porém, tudo isso é possível "emular", na maioria da vezes com a poderosa função prototype do JS.
function animal(){};
Para se instanciar o objeto, usamos o new
var cavalo = new animal;
Caso sua função retorne o objeto
function animal()
{
return this;
};
não é necessário usar o new
var cavalo = animal;
function animal()
{
// propriedade
this.orelhas = 2;
this.olhos = 2;
//método
this.emitir_som = function(som) {
alert(som);
}
};
var cavalo = new animal;
// le propriedade do objeto
alert(cavalo.olhos); // alerta -> 2
alert(cavalo.orelhas); // alerta -> 2
// invoca método emitir_som do objeto
cavalo.emitir_som("innhornhornhorn"); // alerta -> innhornhornhorn
Por enquanto é isso. No próximo falarei de encapsulamento e herança.
By: Eduardo Almeida- 1/6/2011
Em: Server side, Ambientes & Linguagens - Comentários: 1 - Leituras: 625
Para aprender o ASPL é preciso:
By: Eduardo Almeida- 1/6/2011
Em: Server side, Ambientes & Linguagens - Comentários: 2 - Leituras: 2622
Bom pessoal, aqui vai um tutorial rápido que vou abranger os seguintes tópicos:


<% $Response->Write("Hello World com ASPL"); %>
|
<% $conexao = $Server->CreateObject("ADODB.Connection"); # chamada do objeto ADODB.Connection no aplicativo
$conexao->Open("DRIVER={PostGreSQL UNICODE};SERVER=host; DATABASE=nomedobanco;UID=usuario;PWD=senha; OPTION=3;"); # abertura da conexar através de uma string DSN
$RS = $conexao->Execute( "SELECT * FROM tbl_clientes WHERE celular<>'';" );
if (! $RS->{EOF})# se nao for o final da tabela
{
$i=0;
while ( ! $RS->{EOF} ) # enquanto nao for o final da tabela
{
print $RS->Fields("celular")->{Value};
$Response->Flush();
$i ;
$RS->MoveNext();
};
}else
{
print "nehum registro encontrado";
};
$RS->Close();
$conexao->Close(); %>
|
By: Eduardo Almeida- 12/8/2010
Em: Server side, Ambientes & Linguagens - Comentários: 0 - Leituras: 2565
< % @ LANGUAGE = PerlScript % >
< %
sub conectar()
{
$conexao = $Server->CreateObject("ADODB.Connection");
$conexao->Open("DRIVER={PostGreSQL UNICODE};SERVER=hostdoserver; DATABASE=nomebanco;
UID=usuario;PWD=senha;OPTION=3; set lc_monetary=pt_BR; set lc_numeric=pt_BR; set lc_time=pt_BR;
SET datestyle TO POSTGRES, DMY;");
}
sub desconectar()
{
$conexao->Close();
}
conectar();
$RS = $conexao- >Execute( "SELECT * FROM tbl_imoveis" );
$i=0;
while ( ! $RS- >{EOF} )
{
print $RS- >Fields("titulo")- >{Value};
print "< BR >";
$i ;
$RS- >MoveNext();
};
print $i;
$RS- >Close();
desconectar();
% >
< /BODY >
< /HTML >
By: Eduardo Almeida- 12/8/2010
Em: Server side, Ambientes & Linguagens - Comentários: 0 - Leituras: 2500
Exemplo de conexão com device
< % @ LANGUAGE = PerlScript % >
< %
$Response->{Charset} = "UTF-8";
if ($acao eq 'enviar')
{
$Response->{Buffer} = True;
conectar();
use Device::Gsm;
my $dispositivoGSM = new Device::Gsm( port => 'COM5', pin => '2808' ) or die "Nao foi possivel conectar ao dispositivo!";
$dispositivoGSM->connect() or die "Nao foi possivel conectar ao dispositivo!";
$dispositivoGSM->register();
$mensagem=$Request->Form("mensagem")->Item();
$RS = $conexao->Execute( "SELECT * FROM tbl_clientes WHERE celular<>'';" );
if (! $RS->{EOF})
{
$i=0;
while ( ! $RS->{EOF} )
{
$dispositivoGSM->send_sms( recipient => $RS->Fields("celular")->{Value}, status_report=>True, ##class=>'normal', class=>'flash', content => $mensagem );
print $RS->Fields("celular")->{Value}." enviado";
$Response->Flush(); $i ; $RS->MoveNext();
};
}else
{
print "Não há nenhum cliente com celular no banco de dados";
};
$RS->Close();
desconectar();
}% >
By: Eduardo Almeida- 12/8/2010
Em: Server side, Ambientes & Linguagens - Comentários: 0 - Leituras: 788
Orientação a Objeto??
quem disse que não tem?
->>>>>>>>> arquivo oo.asp (usando perl eim gente)
< % @ LANGUAGE = PerlScript % >
< %
{
package Animal;
sub falar {
my $nome = shift;
print "o $nome faz ",
$nome->som, "!\n";
}
}
{
package Boi;
@ISA = qw(Animal);
sub som { "moooo" }
}
Boi->falar;
print Boi->som;
print Boi->som;
print Boi->som;
print Boi->som;
{
package Rato;
@ISA = qw(Animal);
sub som { "squeak" }
sub falar {
my $nome = shift;
print "o $nome faz ", $nome->som, "!\n";
print "[mas raramente vc ira ouvi-lo!]\n";
}
}
Rato->falar;
% >
E MAIS: ASP com PERL, tem herança múltipla, coisa que JAVA e .NET não tem
By: Eduardo Almeida- 17/5/2011
Em: Server side, Ambientes & Linguagens - Comentários: 0 - Leituras: 3681
Vi esses dias em uma comunidade um certo sr. questionando:
"ASP ou PHP? Qual o melhor script em termos de web sei que aqui só comenta de ASP mas o PHP é tão ótimo como o Active Server Pages, então qual é o melhor?"
Vamos lá:
# ASP (active server pages) não é uma linguagem, é um ambiente, um compilador poliglota, assim como o .net.
# O ASP é só um padrão, uma especificação de como trabalhar com html e uma programacao qualquer de alto nivel no mesmo documento (.asp, .aspl), misturando os códigos.
# Para desenvolver um aplicativo, site, o que for, em asp, não é necessário programar usando VBScript, como muitos pensam, para se programar para o ambiente ASP, pode se utilizar qualquer linguagem de Scripting que possa ser instanciada, como Perl, Python, TCL, Javascript (o mesmo que usamos na camada cliente), PHP (isso mesmo, o php), e por ai vai.
# No meu caso, uso o PERL e Python, que são linguagens completas, para operações críticas, me da suporte á todo o ambiente do servidor, suporte completo a orientação a objeto, são da família do C e do C++, são cross platform (isso mesmo, meus aplicativos .ASP rodam em servidores windows, linux e unix com IIS, Apache ou Chili ASP)
# Como o ASP pode interpretar muitas linguagens, podemos, no mesmo aplicativo, utilizar diversas linguagens e tirar proveito das caracteristicas especiais de cada uma, alem lógico, de desenvolver aplictivos confiáveis de grande porte e escalabilidade.
# a compreensão "total" do ASP, é sem dúvidas, muito mais complexa do que PHP
# O ASP, é uma vítima do próprio criador, o Tio Bill, que, quando percebeu, que seu ambiente tinha maior poder usando linguagens de terceiros (a linguagem padrao do ASP é VBscript), e que seria muito dificil de fazer uma "conquista em massa dos desenvolvedores" para a plataforma ASP, descontinuou o produto, e lancou o .NET
O .Net nada mais é que a mesma coisa que o ASP, é um interpretador poliglota, só que agora, as linguagens padroes, VBnet e C# (o c++ misturado com vb criado pela microsoft), e com muitas jogadas de marketing, pois com o uso do .net, a microsoft consegue vender todos os seus produtos, desde servidores a aplicativos como office, pois como os softwares desenvolvidos em .net, demandam por padrao servers MS e estacoes de rede MS, assim, quando ela criou no mercado, a tendencia em usar o .net, ela nada mais tava fazendo que uma venda casada, vende o framework que vai fazer o ERP da empresa, e ja vende junto todos seus produtos, server que vai rodar o ERP, cliente de rede que vai acessar o ERP ....
Enfim, muitos, pelo fato da MS nao dar mais suporte ao ASP, acham que o ASP é obsoleto, ruim, fraco, velho, arcaico, ... na realidade, o ASP é filho bastardo da MS que poucos sabem, mas é um poderoso ambiente multi plataforma, e até me atreveria em dizer que mais poderoso que o proprio .net e o .jsp se codificado com Perl ou Python por exemplo.
# PHP é derivado do PERL
# PHP é uma linguagem
# PHP foi desenvolvido voltado a web, ASP utiliza todo o proveito que outras linguagens lhe oferecem.
Por curiosidade, vai aqui um trecho de um aplicativo meu, em ASP x PERL, que le um arquivo texto com inumeros telefones sem o DDD e divididos por -. Extrai o "-" de cada numero, acrescenta o ddd 061 em cada numero, salva em um outro arquivos todos os numeros novos e escreve na tela cada numero novo salvo no arquivo novo
======> letxt.asp
< % @ LANGUAGE = PerlScript % >
< %
use Fcntl qw(:flock :seek);
$arquivo = $Server->MapPath('sms.txt');
$arquivo2 = $Server->MapPath('sms2.txt');
##abre arquivo
open(ARQUIVO, $arquivo) or die "Nao foi possivel abrir o arquivo $arquivo para leitura: $!";
open(ARQUIVO2, ">$arquivo2") or die "Nao foi possivel abrir o arquivo $arquivo para leitura: $!";
my @linhas = ;
#ordena lista
@linhas = sort @linhas;
$i=0;
foreach my $linha (@linhas)
{
$linha =~s/-//;
$linha="061$linha";
print ARQUIVO2 "$linha";
$Response->write ("$linha");
$i++;
};
print $i;
% >
Agora, proponho o desafiio de fazerem o mesmo que fiz em VBScript, com menos linhas.
Tudo o que eu disse acima, em "o que o ASP faz" e quanto a usar as outras linguagens dentro do ASP, ta dentro site da Microsoft http://msdn.microsoft.com/en-us/library/ms974552.aspx :
"Developing a script platform for Windows is an interesting challenge; we have definite ideas of where we want to take the Microsoft script languages, Visual Basic® Scripting Edition (VBScript) and JScript®, we introduce new technologies, such as Windows Script Host (WSH) and scriptlets—yet the script world still appears to be dominated by Perl and its loyal army of developers. I thought I'd start the new year off with an article covering Perl, what Microsoft thinks about it, and how you might use it in your next Web project."
Desde de 1998 ...
a WEB2 vêm desenvolvendo sites, softwares, implementando ambientes servidores,
prestando consultoria na área de segurança para diversas empresas
como bancos, imobiliárias, agências, cartórios, escritórios de advocacia e até
empresas multi-nacionais. Trabalhamos para criar
experiências intuitivas para os usuários, desenhar interfaces ricas e
elegantes, desenvolver aplicativos úteis, consolidar sites e produtos
que ajudamos a criar, seja desenvolvendo, analisando ou melhorando sua performance. Resumindo, construímos "business" para internet.
Copyright © 2012 WEB2 Soluções LTDA. CNPJ: 14.832.733/0001-05.