quinta-feira, 31 de março de 2011

Partes importantes do kernel

O Kernel do linux é formado por diferentes partes: gerenciador de processos, gerenciador de memória, controle de dispositivos de hardware, controle de sistemas de arquivos, gerenciador de rede e vários outros. A figura abaixo mostra alguns deles.

kernel

Provavelmente as partes mais importantes do kernel ( nada funciona sem elas ) são o gerenciador de memória e o gerenciador de processos. O gerenciador de memória é o responsável pela atribuição de áreas de memoria e áreas de troca (swap) para os processos, para os demais componentes do kernel e para o cache de disco. O gerenciador de processos cria processos e implementa multitarefa através da troca de processos ativos no processador.

No nível mais baixo, o kernel contem controladores (drives) para cada tipo de hardware suportado. Uma vez que existem inúmeros hardwares, o numero de controladores também é muito grande. A similaridade de funcionalidades permite que se tenham classes de controladores para suportar funções similares, ou seja, cada membro de uma determinada classe de hardwares tem a mesma interface com o resto do kernel, mas diferem somente no que é necessário para implementar as suas características especificas. Por exemplo, todos os discos rígidos parecem iguais para o resto do kernel, isto é, todos tem operações como “inicialize o dispositivo”, “leia o setor N” e “grave o setor N”.

Alguns serviços de software disponibilizados pelo kernel tem propriedades similares, e podem ser também derivados em classes. Por exemplo, os diversos protocolos de rede foram abstraídos em uma interface de programação, a biblioteca BSD de socket. Outro exemplo é a camada do sistema virtual de arquivos  (VFS), a qual abstrai as operações dos diversos sistemas de arquivos de suas implementações. quando alguma entidade tenta utilizar um sistema de arquivos, a requisição é direcionada ao VFS, o qual a reencaminha para o controlador adequado ao sistema de arquivos solicitado.

quarta-feira, 30 de março de 2011

Visão Geral de um Sistema Linux

Um sistema operacional UNIX consiste de um núcleo (kernel) e alguns programas do sistema.  Há ainda aplicações que executam diversas tarefas. O kernel é o coração do sistema operacional. Ele mantem o controle dos arquivos em disco, inicializa programas e executa-os de forma concorrente, aloca memória e outros recursos para os diversos processos, recebe e envia pacotes da rede, e assim por diante. O kernel faz muito pouco sozinho, na verdade ele provê ferramentas com as quais os serviços podem ser desenvolvidos. Ele ainda evita que qualquer um possa acessar diretamente os componentes de hardware, forçando o uso das ferramentas disponíveis. Deste modo, o kernel mantem uma certa proteção entre os usuários. As ferramentas disponibilizadas pelo kernel são utilizados através das chamadas ao sistema (system calls).

Os programas de sistema utilizam as ferramentas disponibilizadas pelo kernel para implementar os diversos serviços necessários ao sistema operacional. Programas de sistema e todos os demais programas, são executados ‘sobre o kernel’, o qual é denominado modo usuário (user mode). a diferença entre programas de sistemas e aplicações esta no seu objetivo: as ultimas visam que coisas uteis sejam realizadas (brincar, caso seja um jogo), enquanto os primeiros são necessários para manter o sistema operacional funcionando. Um editor de texto é uma aplicação, o telnet é um programa de sistema. a diferença é algumas vezes muito pequena, e somente é importante para classificadores compulsivos.

Um sistema operacional pode ainda conter compiladores e suas bibliotecas correspondentes (gcc e C no caso do Linux), ainda que nem todas as linguagens devam ser parte integrante do sistema operacional. Documentação e até mesmo jogos podem fazer parte. Tradicionalmente o sistema operacional tem sido definido como o conteúdo nos discos de instalação, o que no Linux pode variar bastante, já que ele pode ser encontrado em diversos sites ao redor do mundo.

segunda-feira, 14 de março de 2011

Datas de Calendário em Informix

Datas de calendário em Banco de Dados Informix são armazenados como inteiros representando o numero de dias corridos desde 31 de dezembro de 1899. Como valores DATE são inteiros, eles podem ser usados em expressões aritméticas. Por exemplo:

SELECT order_date + 5 FROM orders

O exemplo acima adiciona cinco dias para cada data do pedido.

Quando a data é exibida por um servidor de banco de dados IBM Informix, o formato padrão é mm/dd/aaaa. Funções podem ser aplicadas para os valores armazenados em um tipo de dado DATE para modificar o modo de exibição, ou extrair o dia, dia da semana, e assim por diante.

Os tipos de dados cronológicos adicionais são:

  • DATETIME – registra um ponto exato no tempo, com precisão de um ano até uma fração de segundo. Quando você define uma coluna DATETIME. você pode especificar a sua precisão.
  • INTERVAL- armazena a medida de tempo entre dois tipos de dados DATETIME.

Algumas das funções relatadas para data e hora são listadas abaixo. Você pode usar essas funções na clausula SELECT ou na clausula WHERE de uma query. Essas funções retornam um valor que corresponde à expressão ou argumentos que você usa para chamar a função.

  • DAY (expressão date / datetime) – retorna um valor inteiro que representa o dia do mês.
  • MONTH (expressão date / datetime) – retorna um valor inteiro que representa o mês.
  • WEEKDAY (expressão date / datetime) – retorna um inteiro que representa o dia da semana (de 0 a 6, onde Domingo é 0 (zero)).
  • YEAR (expressão date / datetime) – retorna um inteiro de quatro dígitos que representa o ano.
  • DATE (expressão nondate) – retorna um valor DATE que corresponde a uma expressão caractere com a qual você chamou.
  • EXTEND (expressão date / datetime, [ primeiro ao ultimo]) – ajusta a precisão do valor DATE ou DATETIME.
  • MDY (mês, dia, ano) – retorna um DATE no formato mm/dd/aaaa com o mês, dia e ano informados.
  • CURRENT – retorna um valor DATETIME do instante corrente.

Uma expressão date / datetime é uma expressão que corresponde a um valor DATE ou DATETIME.

Exemplos:

Comparando Datas

SELECT customer_num, call_dtime
FROM cust_calls
WHERE call_dtime >= ‘2011-03-14’;

 

SELECT customer_num, call_dtime
FROM cust_calls
WHERE call_dtime >= DATE(‘03/14/2011’)

Extraindo o Mês

SELECT customer_num, MONTH(call_dtime)
FROM cust_calls

As funções TODAY e CURRENT

SELECT customer_num, MONTH(call_dtime)

FROM cust_calls

WHERE MONTH(call_dtime) = MONTH(CURRENT)

AND YEAR(call_dtime) < YEAR(CURRENT);

SELECT customer_num, MONTH(call_dtime)

FROM cust_calls

WHERE MONTH(call_dtime) = MONTH(TODAY)

AND YEAR(call_dtime) < YEAR(TODAY);

Também as funções TODAY ou CURRENT podem ser usadas para extrair o mês, dia, ano ou dia da semana da data do sistema. Esse exemplo usa a função TODAY e CURRENT para comparar os valores da coluna call_dtime para o mesmo mês corrente, mas do ano anterior.

A função TODAY retorna a data do sistema como um tipo DATE. A função CURRENT retorna o valor como um DATETIME.

A função EXTEND

SELECT customer_num call_dtime

FROM cust_calls

SELECT customer_num, EXTEND(call_dtime, month to minute)

FROM cust_calls

O primeiro exemplo acima retorna os valores de customer_num e call_dtime da tabela cust_calls sem o uso da função EXTEND. no segundo exemplo, a função EXTEND restringe os valores DATETIME da coluna call_dtime da tabela cust_calls exibindo somente os sub-campos especificados, de um mês ate minuto. Note que o ano não é retornado nesse exemplo.

A função TO_CHAR

SELECT TO_CHAR(call_dtime, ‘%A %B %d %Y %R’)

FROM cust_calls

A função TO_CHAR converte um valor DATE ou DATETIME para uma sequencia de caractere. A sequencia de caracteres contem a data no formato requisitado. Se você omitir todos os símbolos de formato, o formato padrão de data é usado.

Símbolo:

Faixa de caractere retornada:

%A

Nome completo do dia da semana

%B

Nome completo do mês

%d

Dia do mês como um decimal

%m

Mês como um decimal

%Y

Ano como um decimal de 4 dígitos

%R

Hora do dia no formato de 24 horas

Nota: A função TO_CHAR foi introduzida com o IDS 7.3

A função TO_DATE

SELECT * FROM cust_calls

WHERE call_dtime = TO_DATE(‘2011-03-14 14:56’,’%Y-%m-%d %H:%M’)

A função TO_DATE converte uma sequencia de caracteres para um valor DATETIME. A sequencia de caracteres é convertida de acordo como o formato especificado. Os símbolos de formato para a função TO_CHAR pode ser usados, bem como:

Símbolo:

Faixa de caractere retornada:

%H

Numero de horas

%M

Numero de minutos

Se você omitir o formato, o formato padrão do DATETIME é usado para converter a expressão.

sexta-feira, 11 de março de 2011

UNIQUE ou DISTINCT?

Use DISTINCT ou UNIQUE para exigir que as colunas em que o índice baseia-se aceitar apenas os dados únicos. Se você não especificar a palavra-chave UNIQUE ou DISTINCT, o índice vai permitir valores duplicados nas colunas indexadas ( ou um conjunto de colunas indexadas). O exemplo abaixo cria um índice único:
CREATE UNIQUE INDEX c_num_ix ON customer (customer_num)
Um índice único impede valores duplicados na coluna customer_num. A coluna com um índice único pode ter, no máximo, um valor NULL.

A palavra-chave DISTINCT e UNIQUE são sinônimos neste contexto, a declaração abaixo tem o mesmo efeito da declaração acima:
CREATE DISTINCT INDEX c_num_ix ON customer (customer_num)
Os índices em ambos os exemplos é mantida em ordem ascendente, qual é a ordem padrão.

Você também pode evitar dados duplicados em uma coluna ou um conjunto de colunas criando um UNIQUE CONSTRAINT com a declaração CREATE TABLE ou ALTER TABLE.

Em uma Query você pode evitar as linhas duplicadas de dados no resultado retornado incluindo a palavra-chave DISTINCT, ou o seu sinônimo UNIQUE, em seu comando SELECT. UNIQUE é uma extensão do IBM Informix para o padrão ANSI.

Quando você usa a palavra-chave DISTINCT ou UNIQUE, você deve coloca-la imediatamente apos o comando SELECT, no inicio de seleção. Ele é aplicado para toda a linha.

A palavra-chave DISTINCT ou UNIQUE, suprime os valores duplicados.

quarta-feira, 9 de março de 2011

Usando Expressões Regulares no SquidGuard

Nunca será possível adicionar todas as paginas que deseja bloquear pelos arquivos domains e url.  Para alcançar um nível maior de segurança podemos usar o expressionlists.
Em uma expressionlist podemos entrar com palavras que provavelmente não se encontram em partes nos domains e urls. Cada domains e url  serão comparados com as entradas encontradas em expressionlist.

Atenção: Somente use o expressionlist se você tem certeza que não se enquadram em sites inocentes. Além disso o uso dessas listas podem impactar na performance do sistema.

  1. Adicionando listas de expressões na configuração.
    Listas de Expressões são incluídas na tag dest. O exemplo abaixo mostra como fica o arquivo de configuração do squidGuad:

    Usando a lista de expressões para bloquear porn

    dest porn {
          domainlist        porn/domains
          urllist                porn/urls
          expressionlist   porn/expressions
    }
    Podemos adicionar a lista de expressões para cada destino definido (lembre-se: Performance!). SquidGuard procura pelo arquivo de expressões definido em dbhome.
  2. Sintaxe das listas de expressões
    O formato do arquivo expressionlist são linhas com expressões regulares:

    .

    Corresponde a qualquer caracter (use “\.” para corresponder a um “.”)

    [abc] Corresponde a um dos caracteres (“[abc]” corresponde a um dos caracteres “a” ou “b” ou “c”).
    [c-g] Corresponde a um dos caracteres no range (“[c-g]” corresponde a um dos caracteres “c” ou “d” ou “e” ou “f” ou “g”.
    ”[a-z0-9]” corresponde a qualquer letra ou digito.
    ”[-/.:?]” corresponde a um único “-“ ou “/” ou “.” ou “:” ou “?”).
    ? Nenhum ou um dos anteriores (“words?” corresponderá “word” e “words”
    ”[abc]?” corresponderá há “a” ou “b” ou “c” ou nada (“”))
    * Nenhum ou mais das anteriores (“words*” corresponderá há “word”, “words” e “wordssssss”. “.*” correspondera a qualquer coisa incluindo nada)
    + Um ou mais das anteriores (“xxx+” correspondera a uma sequencia de 3 ou mais “x”).
    (expr1|expr2) Uma das expressões. Uma expressão similar (“(foo|bar)” correspondera há “foo” ou “bar”.
    ”(foo|bar)?” correspondera a “foo” ou “bar” ou nada (“”)).
    $ Final da linha (“(foo|bar)$” correspondera a “foo” ou “bar” somente no final da linha.
    \x Desativar o significado especial de x, where x é caráter especial em regex “.?*+()^$[]{}\” (“\.” correspondera a um unico “.”, “\\” a um unico “\”, etc…)
     

As entradas para as listas de expressões são cleartext. Assim, um começo para bloquear um possivel material sexual, corresponde à expressão poderia parecer:

(^|[-\?+=/_])(bondage|boobs?|busty?|hardcore|porno?|sex|xxx+)([-\?+=/_]|$)

 

até mais.