Criando um sistema de colunistas em Joomla

Percebo que vários desenvolvedores Joomla recorrem a componentes ou módulos extras para executar tarefas que o próprio Joomla oferece nativamente. Isso porque muitos desconhecem todo o poder desse CMS fantástico. Neste artigo, vamos aprender a criar um sistema de colunistas, articulistas, colaboradores...

Ler mais

MSSQL – Query para saber quantas sessões estão abertas

Postado por Rafael | Postado em Desenvolvimento, SQL | Postado 02-04-2011

0

SELECT login_name As ‘Login’ ,

COUNT(session_id) AS ‘Conexões’

FROM sys.dm_exec_sessions

GROUP BY login_name;

MSSQL – sys.dm_exec_requests o que é?

Postado por Rafael | Postado em Desenvolvimento, SQL | Postado 02-04-2011

Tags:, ,

0

Retorna informações sobre cada solicitação sendo executada no SQL Server.

Nome de coluna

Tipo de dados

Descrição

session_id

smallint

ID da sessão a que esta solicitação está relacionada. Não permite valor nulo.

request_id

int

ID da solicitação. Exclusiva no contexto da sessão. Não permite valor nulo.

start_time

datetime

Carimbo de data e hora em que a solicitação chegou. Não permite valor nulo.

status

nvarchar(30)

Status da solicitação. Pode ser o seguinte:

  • Plano de fundo

  • Executando

  • Executável

  • Hibernando

  • Suspenso

Não permite valor nulo.

command

nvarchar(16)

Identifica o tipo atual de comando que está sendo processado. Os tipos de comando comuns incluem:

  • SELECT

  • INSERT

  • UPDATE

  • DELETE

  • BACKUP LOG

  • BACKUP DB

  • DBCC

  • WAITFOR

O texto da solicitação pode ser recuperado usando-se sys.dm_exec_sql_text com o sql_handle correspondente para a solicitação. Os processos de sistema internos definem o comando com base no tipo de tarefa que eles executam. As tarefas podem incluir o seguinte:

  • LOCK MONITOR

  • CHECKPOINTLAZY

  • WRITER

Não permite valor nulo.

sql_handle

varbinary(64)

Mapa de hash do texto SQL da solicitação. Permite valor nulo.

statement_start_offset

int

Número de caracteres no procedimento em lote ou armazenado atualmente em execução no qual a instrução atualmente em execução se inicia. Pode ser usado junto com sql_handle, statement_end_offset e a função de gerenciamento dinâmico sys.dm_exec_sql_text para recuperar a instrução atualmente em execução para a solicitação. Permite valor nulo.

statement_end_offset

int

Número de caracteres no procedimento em lote ou armazenado atualmente em execução no qual a instrução atualmente em execução termina. Pode ser usado junto com sql_handle, statement_end_offset e a função de gerenciamento dinâmico sys.dm_exec_sql_text para recuperar a instrução atualmente em execução para a solicitação. Permite valor nulo.

plan_handle

varbinary(64)

Mapa de hash do plano para execução SQL. Permite valor nulo.

database_id

smallint

ID do banco de dados no qual a solicitação está em execução. Não permite valor nulo.

user_id

int

ID do usuário que enviou a solicitação. Não permite valor nulo.

connection_id

uniqueidentifier

ID da conexão em que a solicitação chegou. Permite valor nulo.

blocking_session_id

smallint

ID da sessão que está bloqueando a solicitação. Se esta coluna for NULL, a solicitação não estará bloqueada ou as informações da sessão de bloqueio não estarão disponíveis (ou não podem ser identificadas).

-2 = O recurso de bloqueio pertence a uma transação distribuída órfã.

-3 = O recurso de bloqueio pertence a uma transação de recuperação adiada.

-4 = A ID da sessão do proprietário da trava de bloqueio não pôde ser determinada neste momento devido a transições internas de estado da trava.

wait_type

nvarchar(60)

Se a solicitação estiver bloqueada, esta coluna retornará o tipo de espera. Permite valor nulo.

wait_time

int

Se a solicitação estiver bloqueada, esta coluna retornará a duração, em milissegundos, da espera atual. Não permite valor nulo.

last_wait_type

nvarchar(60)

Se esta solicitação tiver sido previamente bloqueada, esta coluna retornará o tipo da última espera. Não permite valor nulo.

wait_resource

nvarchar(256)

Se a solicitação estiver bloqueada, esta coluna retornará o recurso pelo qual a solicitação está esperando atualmente. Não permite valor nulo.

open_transaction_count

int

Número de transações abertas para esta solicitação. Não permite valor nulo.

open_resultset_count

int

Número de conjuntos de resultados abertos para esta solicitação. Não permite valor nulo.

transaction_id

bigint

ID da transação na qual esta solicitação é executada. Não permite valor nulo.

context_info

varbinary(128)

Valor CONTEXT_INFO da sessão. Permite valor nulo.

percent_complete

real

Porcentagem de trabalho concluída para os comandos a seguir:

  • ALTER INDEX REORGANIZE

  • Opção AUTO_SHRINK com ALTER DATABASE

  • BACKUP DATABASE

  • DBCC CHECKDB

  • DBCC CHECKFILEGROUP

  • DBCC CHECKTABLE

  • DBCC INDEXDEFRAG

  • DBCC SHRINKDATABASE

  • DBCC SHRINKFILE

  • RECOVERY

  • RESTORE DATABASE,

  • ROLLBACK

  • TDE ENCRYPTION

Não permite valor nulo.

estimated_completion_time

bigint

Somente interno. Não permite valor nulo.

cpu_time

int

Tempo da CPU, em milissegundos, usado pela solicitação. Não permite valor nulo.

total_elapsed_time

int

Tempo total decorrido em milissegundos desde que a solicitação chegou. Não permite valor nulo.

scheduler_id

int

ID do agendador que está programando esta solicitação. Não permite valor nulo.

task_address

varbinary(8)

Endereço de memória alocado à tarefa associada a esta solicitação. Permite valor nulo.

reads

bigint

Número de leituras executadas por esta solicitação. Não permite valor nulo.

writes

bigint

Número de gravações executadas por esta solicitação. Não permite valor nulo.

logical_reads

bigint

Número de leituras lógicas executadas pela solicitação. Não permite valor nulo.

text_size

int

Configuração TEXTSIZE para esta solicitação. Não permite valor nulo.

language

nvarchar(128)

Configuração de idioma para a solicitação. Permite valor nulo.

date_format

nvarchar(3)

Configuração DATEFORMAT para a solicitação. Permite valor nulo.

date_first

smallint

Configuração DATEFIRST para a solicitação. Não permite valor nulo.

quoted_identifier

bit

1 = QUOTED_IDENTIFIER é ON para a solicitação. Caso contrário, é 0.

Não permite valor nulo.

arithabort

bit

1 = configuração ARITHABORT é ON para a solicitação. Caso contrário, é 0.

Não permite valor nulo.

ansi_null_dflt_on

bit

1 = configuração ANSI_NULL_DFLT_ON é ON para a solicitação. Caso contrário, é 0.

Não permite valor nulo.

ansi_defaults

bit

1 = configuração ANSI_DEFAULTS é ON para a solicitação. Caso contrário, é 0.

Não permite valor nulo.

ansi_warnings

bit

1 = configuração ANSI_WARNINGS é ON para a solicitação. Caso contrário, é 0.

Não permite valor nulo.

ansi_padding

bit

1 = configuração ANSI_PADDING é ON para a solicitação.

Caso contrário, é 0.

Não permite valor nulo.

ansi_nulls

bit

1 = configuração ANSI_NULLS é ON para a solicitação. Caso contrário, é 0.

Não permite valor nulo.

concat_null_yields_null

bit

1 = configuração CONCAT_NULL_YIELDS_NULL é ON para a solicitação. Caso contrário, é 0.

Não permite valor nulo.

transaction_isolation_level

smallint

Nível de isolamento com que a transação desta solicitação é criada. Não permite valor nulo.

lock_timeout

int

Tempo limite de bloqueio em milissegundos desta solicitação. Não permite valor nulo.

deadlock_priority

int

Configuração DEADLOCK_PRIORITY da solicitação. Não permite valor nulo.

row_count

bigint

Número de linhas que foram retornadas ao cliente por esta solicitação. Não permite valor nulo.

prev_error

int

Último erro ocorrido durante a execução da solicitação. Não permite valor nulo.

nest_level

int

Nível de aninhamento atual do código sendo executado na solicitação. Não permite valor nulo.

granted_query_memory

int

Número de páginas alocadas à execução de uma consulta na solicitação. Não permite valor nulo.

executing_managed_code

bit

Indica se uma solicitação específica está atualmente executando objetos de tempo de execução de linguagem comum, como rotinas, tipos e gatilhos. É definida para todo o tempo em que um objeto de tempo de execução de linguagem comum estiver na pilha, mesmo durante a execução de Transact-SQL no tempo de execução de linguagem comum. Não permite valor nulo.

group_id

int

ID do grupo de carga de trabalho a que pertence esta consulta. Não permite valor nulo.

query_hash

binary(8)

Valor de hash binário calculado na consulta e usado para identificar consultas com lógica semelhante. Você pode usar o hash de consulta para determinar o recurso agregado usado para consultas que são diferentes apenas nos valores literais. Para obter mais informações, consulte Localizando e ajustando consultas semelhantes usando consulta e hashes de plano de consulta.

query_plan_hash

binary(8)

Valor de hash binário calculado no plano de execução de consulta e usado para identificar planos de execução de consulta semelhantes. Você pode usar o hash de plano de consulta para localizar o custo cumulativo de consultas com planos de execução semelhantes. Para obter mais informações, consulte Localizando e ajustando consultas semelhantes usando consulta e hashes de plano de consulta.

MSSQL – sys.dm_exec_sessions o que é?

Postado por Rafael | Postado em Desenvolvimento, SQL | Postado 02-04-2011

0

Retorna uma linha por sessão autenticada no SQL Server. sys.dm_exec_sessions é uma exibição de escopo de servidor que mostra informações sobre todas as conexões de usuário ativas e tarefas internas. Essas informações contêm versão de cliente, nome do programa cliente, hora de logon do cliente, usuário do logon, configuração da sessão atual etc. Use sys.dm_exec_sessions para exibir primeiro a carga do sistema atual e identificar uma sessão de interesse e, depois, para obter mais informações sobre essa sessão usando outras exibições ou funções de gerenciamento dinâmicas.

Resumindo são as informações que sobre as sessões que estão abertas.

Nome da coluna

Tipo de dados

Descrição

session_id

smallint

Identifica a sessão associada a cada conexão primária ativa. Não permite valor nulo.

login_time

datetime

Hora quando sessão foi estabelecida. Não permite valor nulo.

host_name

nvarchar(128)

Nome da estação de trabalho cliente específica de uma sessão. O valor é NULL para sessões internas. É anulável.

program_name

nvarchar(128)

Nome de programa cliente que iniciou a sessão. O valor é NULL para sessões internas. É anulável.

host_process_id

int

ID de processo do programa cliente que iniciou a sessão. O valor é NULL para sessões internas. É anulável.

client_version

int

Versão de protocolo TDS da interface usada pelo cliente para conexão com o servidor. O valor é NULL para sessões internas. É anulável.

client_interface_name

nvarchar(32)

Nome de protocolo que é usado pelo cliente para conexão com o servidor. O valor é NULL para sessões internas. É anulável.

security_id

varbinary(85)

Identificador de segurança do Microsoft Windows associado ao logon. Não permite valor nulo.

login_name

nvarchar(128)

Nome de logon de SQL Server em que a sessão está sendo executada atualmente. Para o nome de logon original que criou a sessão, consulte original_login_name. Pode ser um nome de logon autenticado por SQL Server ou um nome de usuário de domínio autenticado pelo Windows. Não permite valor nulo.

nt_domain

nvarchar(128)

Domínio de Windows do cliente se a sessão estiver usando Autenticação do Windows ou uma conexão confiável. Este valor é o NULL para sessões internas e usuários que não tiverem domínio. É anulável.

nt_user_name

nvarchar(128)

Nome de usuário do Windows do cliente se a sessão estiver usando Autenticação do Windows ou uma conexão confiável. Este valor é o NULL para sessões internas e usuários que não tiverem domínio. É anulável.

status

nvarchar(30)

Status da sessão. Os valores possíveis são:

  • Executando – Executando uma ou mais solicitações atualmente

  • Suspenso – Não executando nenhuma solicitação atualmente

  • Inativo – A sessão foi reiniciada devido a pooling de conexão e está agora no estado anterior ao logon.

  • Pré-conexão – A sessão está no classificador Administrador de Recursos.

Não permite valor nulo.

context_info

varbinary(128)

Valor CONTEXT_INFO para a sessão. As informações de contexto são definidas pelo usuário com o uso da instruçãoSET CONTEXT_INFO. É anulável.

cpu_time

int

Tempo da CPU, em milissegundos, usado por essa sessão. Não permite valor nulo.

memory_usage

int

Número de páginas de 8 KB de memória usado por essa sessão. Não permite valor nulo.

total_scheduled_time

int

Tempo total, em milissegundos, para o qual a sessão (solicitações internas) era programada para execução. Não permite valor nulo.

total_elapsed_time

int

Tempo, em milissegundos, desde que a sessão foi estabelecida. Não permite valor nulo.

endpoint_id

int

ID do ponto de extremidade associado à sessão. Não permite valor nulo.

last_request_start_time

datetime

Hora em que a última solicitação na sessão começou. Inclui a solicitação atualmente em execução. Não permite valor nulo.

last_request_end_time

datetime

Hora da última conclusão de uma solicitação na sessão. É anulável.

reads

bigint

Número de leituras executadas, por solicitações nesta sessão, durante esta sessão. Não permite valor nulo.

writes

bigint

Número de gravações executadas, por solicitações nesta sessão, durante esta sessão. Não permite valor nulo.

logical_reads

bigint

Número de leituras lógicas executadas na sessão. Não permite valor nulo.

is_user_process

bit

0 se a sessão for uma sessão de sistema. Caso contrário, será 1. Não permite valor nulo.

text_size

int

Configuração TEXTSIZE para a sessão. Não permite valor nulo.

language

nvarchar(128)

Configuração LANGUAGE para a sessão. É anulável.

date_format

nvarchar(3)

Configuração DATEFORMAT para a sessão. É anulável.

date_first

smallint

Configuração DATEFIRST para a sessão. Não permite valor nulo.

quoted_identifier

bit

Configuração QUOTED_IDENTIFIER para a sessão. Não permite valor nulo.

arithabort

bit

Configuração ARITHABORT para a sessão. Não permite valor nulo.

ansi_null_dflt_on

bit

Configuração ANSI_NULL_DFLT_ON para a sessão. Não permite valor nulo.

ansi_defaults

bit

Configuração ANSI_DEFAULTS para a sessão. Não permite valor nulo.

ansi_warnings

bit

Configuração ANSI_WARNINGS para a sessão. Não permite valor nulo.

ansi_padding

bit

Configuração ANSI_PADDING para a sessão. Não permite valor nulo.

ansi_nulls

bit

Configuração ANSI_NULLS para a sessão. Não permite valor nulo.

concat_null_yields_null

bit

Configuração CONCAT_NULL_YIELDS_NULL para a sessão. Não permite valor nulo.

transaction_isolation_level

smallint

Nível de isolamento da transação da sessão.

0 = Não Especificado

1 = Leitura Não Confirmada

2 = Leitura Confirmada

3 = Repetível

4 = Serializável

5 = Instantâneo

Não permite valor nulo.

lock_timeout

int

Configuração LOCK_TIMEOUT para a sessão. O valor está em milissegundos. Não permite valor nulo.

deadlock_priority

int

Configuração DEADLOCK_PRIORITY para a sessão. Não permite valor nulo.

row_count

bigint

Número de linhas retornadas na sessão até este ponto. Não permite valor nulo.

prev_error

int

ID do último erro retornado na sessão. Não permite valor nulo.

original_security_id

varbinary(85)

Identificador de segurança do Microsoft Windows associada a original_login_name. Não permite valor nulo.

original_login_name

nvarchar(128)

Nome de logon do SQL Server que o cliente usou para criar esta sessão. Pode ser um nome de logon autenticado por SQL Server ou um nome de usuário de domínio autenticado pelo Windows. Observe que a sessão pode ter passado por muitas opções de contexto implícitas ou explícitas após a conexão inicial. Por exemplo, se EXECUTE AS for usado. Não permite valor nulo.

last_successful_logon

datetime

Hora do último logon efetuado com êxito para original_login_name antes de a sessão atual ter sido iniciada.

last_unsuccessful_logon

datetime

Hora da última tentativa de logon para original_login_name antes de a sessão atual ter sido iniciada.

unsuccessful_logons

bigint

Número de tentativas de logon malsucedidas para original_login_name entre last_successful_logon e login_time.

group_id

int

ID do grupo de carga de trabalho a que pertence esta sessão. Não permite valor nulo.

Como ver as Querys que usam mais processador

Postado por Rafael | Postado em Desenvolvimento | Postado 02-04-2011

Tags:, , , ,

0

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset
END – qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time/execution_count DESC;

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],

SUBSTRING(st.text, (qs.statement_start_offset/2)+1,

((CASE qs.statement_end_offset

WHEN -1 THEN DATALENGTH(st.text)

ELSE qs.statement_end_offset

END – qs.statement_start_offset)/2) + 1) AS statement_text

FROM sys.dm_exec_query_stats AS qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st

ORDER BY total_worker_time/execution_count DESC;

Efeito de transição em JavaScript parecido com CUBO

Postado por Rafael | Postado em Desenvolvimento, Javascript | Postado 14-12-2010

0

Um componente para efeito de transição, parecido com um cubo.

http://progtuts.info/241/javascript-jquery-flip/

Projeto da Unicamp otimiza computação de alto desempenho em ambientes heterogêneos

Postado por Rafael | Postado em Desenvolvimento | Postado 14-12-2010

0

Parceiro da Microsoft desde 2006, o laboratório do Instituto de Computação da Universidade de Campinas (Unicamp) vem desenvolvendo uma série de projetos relacionados a Computação de Alto Desempenho (mais conhecida pela sigla HPC, acrônimo para High Performance Computing). O projetoVirtual Cluster Orchestration System (ViCOS), publicado no Codeplex, por exemplo, busca prover uma infraestrutura heterogênea para processamento de aplicações de HPC sob demanda, levanto em conta os recursos disponíveis no ambiente físico. “A infraestrutura para HPC é muito cara e em muitos casos não é utilizada em sua totalidade”, justifica Sandro Rigo, professor da Unicamp e um dos coordenadores do Laboratório de Sistemas Computacionais da universidade.

O objetivo é fazer um uso inteligente do processamento ocioso do ambiente, aproveitando momentos de ociosidade do sistema e também liberando os recursos que não estão sendo usados. O foco pode ser tanto em ganhos de desempenho como em economia de energia, usando conceitos de computação em nuvem para criar um ambiente flexível, econômico e tolerante a falhas para o processamento de tarefas de alto desempenho.

Interoperabilidade

Através dele, é possível integrar, numa mesma infraestrutura, clusters HPC de plataformas diversas – hoje a Unicamp trabalha com Windows HPC Server 2008 R2 e Plataforma open source baseada em Linux – e até mesmo formar um ambiente de propósito misto, contendo tanto clusters como máquinas de usos diversos. “Isso pode permitir que um laboratório da universidade, que contém máquinas dedicadas ao uso dos alunos, possa ser usado para executar tarefas de alto desempenho, usando o poder computacional ocioso do ambiente”, exemplifica Rigo. “Isso tudo é feito sob demanda e automaticamente pelo sistema, de acordo com a carga de operação do ambiente.”

O ViCOS faz uso de virtualização, usando Hyper-V Server 2008, de forma que os cluster HPC são formados por máquinas virtuais (VMs) rodando sobre o hardware real de forma transparente. Além disso, outros conceitos de computação em nuvem são usados para garantir que os clusters de alto desempenho virtualizados possam se adequar ao ambiente de acordo com a demanda.

Usando uma infaestrutura de um cluster de torelancia a falhas e técnicas como “live migration” de máquinas virtuais, características providas na tecnologia de “Failover Clustering” presente no Windows Server 2008 R2, é possível fazer com que as VMs sejam movidas pela sistema físico conforme a política de escalonamento adotada, que pode visar tanto um ganho de desempenho, balanceamento de carga ou até economia de energia. A migração transparente garante também que as VMs, que são os componentes dos clusters HPC, fiquem protegidas contra falhas nas máquinas físicas, uma vez que, em caso de problemas, as VMs podem migrar para uma máquina que esteja funcionando corretamente.

MSDN

Infografico sobre HTML5

Postado por Rafael | Postado em Desenvolvimento | Postado 12-12-2010

0

É em inglês mas muito legal.

Web

O que é SVG?

Postado por Rafael | Postado em Desenvolvimento | Postado 11-12-2010

0

SVG é a abreviatura de Scalable Vectorial Graphics que pode ser traduzido do inglês como gráficos vetoriais escaláveis. Trata-se de uma linguagemXML para descrever de forma vetorial desenhos e gráficos bidimensionais, quer de forma estática, quer dinâmica ou animada. Umas das principais características dos gráficos vetoriais, é que não perdem qualidade ao serem ampliados. A grande diferença entre o SVG e outros formatos vetoriais, é o fato de ser um formato aberto, não sendo propriedade de nenhuma empresa. Foi criado pela World Wide Web Consortium, responsável pela definição de outros padrões, como o HTML e o XHTML.
A criação deste formato foi baseada noutros já existentes: CSS, DOM, JPEG, PNG, SMIL e XML.

SVG é a abreviatura de Scalable Vectorial Graphics que pode ser traduzido do inglês como gráficos vetoriais escaláveis. Trata-se de uma linguagemXML para descrever de forma vetorial desenhos e gráficos bidimensionais, quer de forma estática, quer dinâmica ou animada. Umas das principais características dos gráficos vetoriais, é que não perdem qualidade ao serem ampliados. A grande diferença entre o SVG e outros formatos vetoriais, é o fato de ser um formato aberto, não sendo propriedade de nenhuma empresa. Foi criado pela World Wide Web Consortium, responsável pela definição de outros padrões, como o HTML e o XHTML.

A criação deste formato foi baseada noutros já existentes: CSS, DOM, JPEG, PNG, SMIL e XML.

Permitir somente numero em uma caixa de texto HTML / Javascript / .NET

Postado por Rafael | Postado em .NET, Desenvolvimento, Javascript | Postado 11-12-2010

0

function soNumero(event)
{
iKey = KeyStroke( event );
if (!((iKey > 47 && iKey < 58) || iKey == 0 || iKey == 8 || iKey == 13)) {
return false;
}
return true;
}

Um exemplo rápido para permitir digitar somente numero em uma caixa de texto, testei em muitos navegadores e até hoje sem problemas:

A Caixa de Texto:

<asp:TextBox ID=”txtQualquer” onKeyPress=”return soNumero(event);” runat=”server” />

O Javascript :

function soNumero(event)

{

iKey = KeyStroke( event );

if (!((iKey > 47 && iKey < 58) || iKey == 0 || iKey == 8 || iKey == 13)) {

return false;

}

return true;

}

function KeyStroke(event) {
ikey = 0;
if (event.which == undefined) {
ikey = window.event.keyCode;
}
else {
ikey = event.which;
}
return ikey;
}

TRIM (tirar espaços) – Javascript

Postado por Rafael | Postado em Desenvolvimento, Javascript | Postado 11-12-2010

0

function ltrim(str)
{
l = new Number(str.length);
if(l >0){
while (str.charAt(0) == ” ” || str.charAt(0) == “\t”)
str = str.substr(1,l-1);
}
return str;
}
function rtrim(str)
{
l = new Number(str.length);
if(l >0){
while (str.charAt(l-1) == ” ” || str.charAt(l-1) == “\t”)
{
str = str.substr(0,l-1);
l = str.length;
}
}
return str;
}
function trim(str)
{
str = rtrim(str);
str = ltrim(str);
return str;
}

function ltrim(str)

{

l = new Number(str.length);

if(l >0){

while (str.charAt(0) == ” ” || str.charAt(0) == “\t”)

str = str.substr(1,l-1);

}

return str;

}

function rtrim(str)

{

l = new Number(str.length);

if(l >0){

while (str.charAt(l-1) == ” ” || str.charAt(l-1) == “\t”)

{

str = str.substr(0,l-1);

l = str.length;

}

}

return str;

}

function trim(str)

{

str = rtrim(str);

str = ltrim(str);

return str;

}