segunda-feira, abril 18, 2011

Aulas Java - Cronograma

Abaixo segue o cronograma das aulas de programacao:

Aula 1 O que é Java?
Aula 2 Variáveis primitivas e Controle de fluxo
Aula 3 Orientação a Objetos básica
Aula 4 Arrays
Aula 5 Modificadores de acesso e atributos de classe
Aula 6 Orientação a Objetos – herança, reescrita e polimorfismo
Aula 7 Eclipse IDE
Aula 8 Orientação a Objetos – classes abstratas
Aula 9 Orientação a Objetos – interfaces
Aula 10 Exceptions
Aula 11 Pacotes
Aula 12 Ferramentas: jar e javadoc
Aula 13 O pacote java.lang
Aula 14 O pacote java.io
Aula 15 Collections framework
Aula 16 Programação concorrentes e Threads


Boa sorte,

sexta-feira, março 04, 2011

Spring template: queryForObject() method. Retorno de queries vazias.

A post visa basicamente esclarecer a abordagem dada pelo spring framework, mais precisamente, sua implementação do JDBC, spring-jdbc.

Sem entrar em maiores detalhes sobre a implementação e utilização do módulo spring-jdbc, eu gostaria de compartilhar com todos uma experiência que me pareceu inusitada enquanto montava um DAO usando como base este módulo do spring framework.

Sem mais, às formalidades:

Meu DAO de exemplo, é o seguinte:

public class MeuBeanDao extends JdbcDaoSupport {

public MeuBean selectByDescription(String description){
return (MeuBean) getJdbcTemplate().queryForObject(SQL, new Object[]{description}, new MeuBeanRowMapper());

}

}

É uma implementação básica do método queryForObject() usando um array de Object para passar os argumentos e uma implementação do RowMapper, que visa mapear o resultado obtido de cada linha para o objeto a ser retornado.

Até aí tudo bem. Está tudo certo. Meu teste de unidade se saiu perfeito. Porém, num cenário onde não há resultados, exceções podem acontecer.

Por quê?

Porque sim.

O spring framework tem a abordagem de levantar exceções para ambos casos: resultado vazio e non-unique error (quando mais de uma linha é obtida da consulta). No meu caso, eu obtive um EmptyResultDataAccessException. O Spring opta por escolher representar os dois casos como exceções. Todavia, nos parece mais intuitivo se este, ao não encontrar nenhum registro, retornasse um simples java null.

A solução!

A solução encontrada é circundá-lo com um bloco try/catch. Veja abaixo como ficou.

public MeuBean selectByDescription(String description) {
MeuBean result = null;

try{
result = (MeuBean) getJdbcTemplate().queryForObject(SQL, new Object[]{description}, new MeuBeanRowMapper());

}catch(EmptyResultDataAccessException e){
// do nothing... thanks Spring framework...
}

return result;
}

Bom, mais uma postagem colaborativa. Maiores detalhes sobre spring-jdbc, visite o site: http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html

Abraços!

quinta-feira, março 03, 2011

Programação orientada a aspectos: AOP.

What the fuck is that?

Pelo menos, diminui o número de linhas de código...

Continua...

sexta-feira, fevereiro 25, 2011

Enviando arquivo PDF a um Java Servlet

Bom, faz algum tempo que não posto nada e portanto não vou ficar escrevendo desnecessariamente. Basicamente tive a necessidade de enviar de uma aplicação Java (JSE) um arquivo .PDF a outra aplicação Java Web (JEE) usando protocolo HTTP pelo intercurso de um Java Servlet. Tal solução pode ser utilizado num Java Applet.

Segue abaixo o que foi feito.

Aplicação Java (JSE) é bastante simples. Para este exemplo, eu criei uma classe principal chamada Main e toda a lógica está dentro do método main da classe.

Coloque todo o conteúdo baixo dentro de um bloco try/catch. Cuide para captar o Exception e faça o tratamento de acordo com a sua imaginação e necessidade.

// URL da minha aplicação web.

URL url = new URL("http://localhost:8080/TestAppletServletConnServer/StudentServlet");

// Abro a conexão com a minha aplicação web.

URLConnection servletConnection = url.openConnection();

// Seto alguns flags importantes para nossa aplicação. O mais importante de todos é o setOutput igual a true!

servletConnection.setDoOutput(true); servletConnection.setAllowUserInteraction(false); servletConnection.setUseCaches(false);
servletConnection.setDefaultUseCaches(false);

// Seto o parametro MIME para que minha requisicao seja entendida que é um arquivo pdf.
servletConnection.setRequestProperty("Content-Type", "application/pdf");


// Pego a referencia ao OutputStream da propria conexao.
BufferedOutputStream outputToServlet = new BufferedOutputStream(servletConnection.getOutputStream());


// Abro o stream de entrada vindo do arquivo pdf fonte.

FileInputStream input = new FileInputStream(new File("C:\\Temp\\pdf\\testToServer.pdf"));


// Passo a referencia ao objeto BufferedInputStream


BufferedInputStream buf = new BufferedInputStream(input);

// Aqui inicia o loop para escrever no output do servlet aberto anteriormente.


int readBytes = 0;

while ((readBytes = buf.read()) != -1) {

outputToServlet.write(readBytes);

}


outputToServlet.flush();
outputToServlet.close();

// Aqui eu pego uma referencia a um objeto InputStream. Isso eu percebi que é necessário porque somente assim é feito a requisição a classe servlet
BufferedInputStream ois = new BufferedInputStream(servletConnection.getInputStream());

ois.close();


Vamos agora criar o Servlet utilizado no exemplo. Eu ponho tudo dentro de um método processRequest e este processará tando POST quanto GET. Novamente, coloque tudo dentro de um bloco try/catch.

// Pego a referencia ou objeto OuputStream que ha dentro do objeto response ServletOutputStream out = response.getOutputStream();

// Algumas coisas são necessárias e só há dentro do objeto ServletContext.
ServletContext context = this.getServletConfig().getServletContext();

// Seto o tipo de conteúdo
response.setContentType(request.getParameter("contentType"));

// Aqui eu leio do stream de entrada o arquivo pdf.

InputStream istream = request.getInputStream();


// Passo a referencia ao objeto BufferedInputStream.
BufferedInputStream bis = new BufferedInputStream(istream);

// Crio um objeto BufferedOutputStream para escrever a saída numa referencia ao OutputStream do Servlet. Isso é necessário para finalizar com o response.
BufferedOutputStream bos = new BufferedOutputStream(out);

// Crio um objet BufferedOutputStream passando uma referencia ao arquivo que vou criar.

BufferedOutputStream bos2file = new BufferedOutputStream(new FileOutputStream("C:\\Temp\\pdf\\testFromServer.pdf"));


// Stream the file back to the client

byte[] buffer = new byte[4096];
int size;
size = bis.read(buffer);
while (size != -1) {
bos.write(buffer, 0, size);
bos2file.write(buffer, 0, size);
size = bis.read(buffer);

}

bis.close();

bos.flush();
bos.close();

bos2file.flush();
bos2file.close();


Bom, existem outra maneiras de conseguir isso. A minha é uma das muitas possíveis soluções. Notem que não utilizo biblioteca de terceiros.

Sem mais,

Daniel Barcellos

quarta-feira, junho 24, 2009

Projeto "startado"

Finalmente inciamos o projeto que visará a criação de um sistema, ou melhor, o "improvement" de um sistema de formulários eletrônicos e workflow. Nas próxima postagens estarei disponibilizando os dados das equipes envolvidas, isso caso eles deixarem. Mas é para um boa causa.

Abraços!

domingo, maio 17, 2009

Projeto desafiador

Desde um tempo venho prevendo a possibilidade de inciar um projeto que acredito que será muito desafiador para os meus conhecimentos na plataforma Java.
Basicamente, sem mais delongas, o proj. consiste em desenvolver um produto o qual servirá não só para a gerência de documentos como também para workflow. O nome o qual estão sendo previstos eu não curto muito. Acho que não vende... Não vou dizer ainda, pois vai que o chefe utiliza alguma ferramenta de busca pela internet e localiza o meu blog dizendo que o produto que ele quer vender não é, segundo a minha visão, bom o nome. heHEhEHA

Vou tentar postar constantemente para deixa-los informados... se é que alguém vai estar ligando para isso!!!

sábado, março 14, 2009

sexta-feira, março 13, 2009

GWT

Eu não me considero um desenvolvedor muito atualizado. Não estou sempre antenado às novidade da tecnologia de desenvolvimento de software, sobretudo quando se trata do desenvolvimento de aplicações web que é o que mais gosto. Mas recentemente tive contato, quase que por acaso, com a Google Web Toolkit (GWT). Basicamente, é uma toolkit de desenvolvimento de aplicações web 2.0 usando praticamente java. Ela, digamos, abstrai toda a parte de desenvolvimento de scripts javascript, html, css usando para isso apenas a robusta linguagem de programação java. Bom, ainda me sinto muito verde para discorrer precisamente sobre GWT e, portanto, não vou correr o risco de dizer alguma bobagem, etc. Por hora é isso. Só informo que acho que terei uma experiência muito interessante com GWT.
Estarei postando outras novidades a respeito.

sexta-feira, fevereiro 20, 2009

Antileis Já Estabelecidas Na Risofísica - Considerações

Quem me conhece sabe que, volta e meia, eu chamo na, não pouco conhecida, sobretudo, dos profissionais de TI, lei de Murphy. Abaixo, segue uma dissertação acerca das Antileis na Risofísica. Eu não vou me preocupar em explicar os seus significados, até porque é só continuar lendo o e-mail. Mas uma coisa interessante é o que trata uma das Antileis de Murphy e que diz o seguinte: "Deixadas a si mesmas as coisa irão de mal a pior. A natureza está sempre do lado da falha. Estabelecendo que a natureza é canalha, sempre que alguma coisa não dá certo é porque você deixou de fazer alguma coisa." O interessante, no meu ponto de vista, não é o pessimismo da antilei em si, mas o simples fato de que ela, digamos, corrobora a existência de um ser superior dotado de inteligência a nos guiar. Veja o argumento de Murphy: "deixadas por si mesmas as coisas irão de mal a pior". A história humana conta com mais ou menos uns 4000 anos de existência e de incansável evolução. Tal processo evolutivo nos leva a crer que, caso estivéssemos em nossa jornada totalmente sozinhos, haja visto que somos fruto da natureza, muito provavelmente eu não estaria aqui para compartilhar convosco de minhas divagações sobre a trajetória bem sucedida da humanidade, isso porque muito provavelmente algo não teria dado certo. Portanto, me leva a crer que somente guiados por algo acima de nós (não olhe para o teto) conseguimos alcançar o patamar atual de sociedade moderna. Murphy e todas as seitas estão certas e ambos os argumentos se convergem no seguinte: "não há efeito semcausa" (vide o Livro dos Espíritos) e "deixadas por si mesmas as coisas irão de mal a pior".

PS: Este e-mail está postado também nos Blogs: universu.blogspot.com e gnulinuxfreak.blogspot.com

Abraços a todos!

Em 1974, foi dado início à publicação de algumas Antileis Risofísicas em páginas semanais da revista Veja. Essas leis foram denominadas antileis, por serem contra determinadas leis vigentes em todas as atividades humanas, erisofísicas para nos aparentarmos protetoramente com a metafísica. Na verdade essas antileis continuam e contam mais verdades do que as leis estabelecidas e devem ser encaradas com mais seriedade do que elas. Lembrem-se de que a primeira vez em que Proudhon declarou: "Toda propriedade é um roubo" o pessoal da festa caíu na gargalhada diante dessa - na época - antilei. O mesmo aconteceu quando, mais tarde, Lênine indagou: "Afinal o que é o roubo de um banco diante da fundação de um banco?".

Diante disso resolvi mostrar para vocês caros internautas, algumas Antileis Risofísicas.


ANTILEIS JÁ ESTABELECIDAS NA RISOFÍSICA

Antilei de Lowry: "O momento exato em que você se torna excelente em determinada coisa coincide com o momento em que você não precisa mais dela."

Antilei de Milton: "O parente mais próximo e mais violento do jogador de futebol que você xinga está sempre sentado exatamente à sua frente, na arquibancada do Maracanã."

Antilei de Pondiczery: "A vida é a causa da morte."

Antilei de Young: "T1 é o tempo necessário pruma pessoa que discou o telefone chegar à conclusão de que não vão atender do outro lado. T2 é o tempo necessário para a pessoa do outro lado - que está no banheiro - chegar ao telefone que toca. Logo T1 = T2."

Antilei de Cox: "Pra onde quer que você mude é sempre do mesmo lado da rua."

Antilei de Etorre: "A outra fila sempre anda mais rápido. Isso se aplica a qualquer fila, banco, alfândega, supermercado, tráfego. Não mude de fila pois a antilei não muda - a outra fila sempre anda mais rápido."

Antilei de Murphy: "1.Se houver possibilidade de alguma coisa dar errado, dará. 2. Das coisas que não tem a menor possibilidade de dar errado, algumas darão."

Antilei de Murphy: Deixadas a si mesmas as coisa irão de mal a pior. A natureza está sempre do lado da falha. Estabelecendo que a natureza é canalha, sempre que alguma coisa não dá certo é porque você deixou de fazer alguma coisa."

Antilei de Parkinson: "O trabalho se expande até preencher o tempo disponível."

Antilei de da mulher de Parkinson: "As despesas se expandem até o consumo total da renda."

segunda-feira, fevereiro 16, 2009

Certificação Oracle

Estou dando início ao meu processo de certificação Oracle. Vou buscar, a princípio, a certificação Oracle OCA. São dois exames: 1Z0-001 (Introduction to Oracle: SQL and PL/SQL) e 1Z0-147 (Program with PL/SQL). Essa certificação é basicamente para desenvolvedores. Existem outras certificações. Caso estejas interessado, consulte o site http://education.oracle.com

Abraços!

terça-feira, janeiro 13, 2009

Extendendo PL/SQL com JAVA

Este artivo visa explanar uma experiência que tive recentemente na qual tive a necessidade de aperfeiçoar rotinas em Oracle PL/SQL com classes JAVA. Aparentemente o que pode parecer complicado não é! É necessário também informar que este artigo baseia-se em capítulo do livro Expert Oracle PL/SQL escrito por Ron Hardman e Michael McLaughlin (McGraw-Hill/Osborne, 2005; ISBN: 0072261943). Válido também é fazer nota ao artigo de autoria por mim desconhecida mas que foi muito importante também http://docstore.mik.ua/orelly/oracle/guide8i/ch09_08.htm

O problema.

Quando inciei um projeto de desenvolvimento de um sistema de informação, um pouco Work Flow, um pouco ERP (guardado as devidas proporções para este último), tive a necessidade de processar documentos no formato XML. Então criei um modelo de documento XML e iniciei o desenvolvimento de uma rotina em Oracle PL/SQL que fizesse, entre outras palavras, a leitura desse xml. Foi um processo de criação de um algoritmo vencedor que lesse o xml em questão. Contudo, após alguns testes bem sucedidos, me debati com um problema enorme de performance da leitura do xml. Isso porque o PLSQL não é uma linguagem otimizada para esses tipos de tarefas.
Bom, procurando algo por aí na internet, mais precisamente no Google.com, achei umas funcionalidades bastante úteis onde é possível integrar a poderosa ferramenta de programação JAVA com Oracle PL/SQL. Basicamente, desde a versão 9i da Oracle é possível usar componentes OO Java, ou seja, classes javas, POJOS, etc diretamente em banco através de PL's.

Os prérequisitos.

Vamos precisar para concretização desse artigo do seguinte:
i. um sistema operacional LINUX (qualquer um);
ii. um sistema de banco de dados relacional Oracle (10g preferencialmente, pois foi a versão que uso)
iii. um ambiente de desenvolvimento JAVA (Netbeans ou Eclipse);
iv. JDK 1.4.2*

* o uso da JDK 1.4.2 dá-se em função da VM embarcada no Oracle ser a 1.4. Não quero entrar nesse mérito. Não agora...

O desenvolvimento.

Como dito, precisei fazer o parsing de um documento xml. Para isso recorri à API JDOM que manipula muito bem os elementos de documentos xml. Em nosso exemplo simples vou usar um POJO para demonstrar como implementar classes java em stored procedures Oracle.

Eis a classe:

/*
* GnuLinuxFreak.java
*
* Created on 5 de Fevereiro de 2009, 10:21
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package jplsql;

/**
*
* @author Daniel Barcellos
*/
public class GnuLinuxFreak {

private static String freak;

/** Creates a new instance of GnuLinuxFreak */
public GnuLinuxFreak() {
}

public static void setFreak(String frk) {
freak = frk;
}

public static String getFreak() {
return freak;
}
}

Tanto os atributos quanto os metodos tem de utilizar o modificador static porque será necessário envocá-los diretamente sem a necessidade de instanciar objetos da classe.
Exemplo:

GnuLinuxFreak.getFreak();

Agora, vamos aos objetos de banco.

Eis a procedure. Note a utilização do operador AS LANGUAGE JAVA o qual informa ao compilador de que se trata de uma implementação com JAVA.

CREATE OR REPLACE PROCEDURE PRC_GNU_LINUX_FREAK( P_FREAK VARCHAR )
AS LANGUAGE JAVA
NAME 'GnuLinuxFreak.setFreak(java.lang.String)';

A function.

CREATE OR REPLACE FUNCTION FNC_GNU_LINUX_FREAK RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'GnuLinuxFreak.getFreak(java.lang.String) return java.lang.String';

A diferença, entre outras, é o fato que, na implementação da chamada à classe tanto no argumento (parâmetro), quanto no retorno deve-se utilizar o full qualified name da classe correspondente.

Agora, vamos fazer o load da classe em nossa base. Para tanto, utilizaremos o utilitario loadjava. Este é um utilitário de linha de comando, o que obriga decorar uma quase que infinidade de comandos adicionais. É possível também fazê-lo utilizando a chamada DBMS_JAVA.LOADJAVA

call dbms_java.loadjava(' -schema "" C:\Temp\JPlsql.jar')

Em nosso exemplo utilizaremos o utilitario de linha de comando. A sintaxe usada segue abaixo:

loadjava -v -user USER/SENHA -resolve c:\Temp\JPlsql.jar

Uma listagem explanatória sobre os demais parâmetros pode ser encontrada em http://docstore.mik.ua/orelly/oracle/guide8i/ch09_04.htm.
O argumento -v significa verbose mode, ou seja, mostrará na tela tudo que for de informações do processo de carga.
O -user indicará para o utilitario para qual esquema utilizar na carga.
O -resolve é o cerne do comando propriamente dito. Ele resolverá as dependecias.

Se tu der certo durante o processo todo de carga de nossa classe de exemplo. Podemos passar para os testes. Se você tiver alguma dúvida em algo que deu errado, não deixe de postar comentários, críticas, etc.

Os testes.

Para testar, primeiro vamos fazer a chamada à procedure PRC_GNU_LINUX_FREAK.

EXEC PRC_GNU_LINUX_FREAK('Im Crazy For LINUX!!!');

Em seguida podemos ver se o método getFreak conseguirá buscar a string informada pela procedure acima.

SET SERVEROUTPUT ON
EXEC DBMS_OUTPUT.PUT_LINE(FNC_GNU_LINUX_FREAK);

Tudo certo?!

A conclusão.

Bom, imagine a quantidade de possibilidades que podemos com essas duas ferramentas. Eu sei que muitos fundamentalistas do mundo java dirão porque extender plsql de oracle se hoje em dias podemos contar com as mais diversas API'S e Frameworks disponíveis de acesso a banco de dados e persitência. Eu concordo em partes. Porém quando se trata de sistemas legados onde todas a estrutura foi e está sendo desenvolvida em PLSQL as possibilidade desse casamento podem ser infinitas até o limite de ambas as linguagens.
Sou um grande fã das duas tecnologias e percebo um futuru muito interessante não só para o PLSQL como também para o Java. Agora, image juntá-los.

Até a próxima.

quarta-feira, maio 14, 2008

Ruby On Rails

Faz tempo que não posto absolutamente nda!

Recentemente comprei um livro sobre Ruby porque, além de ter ouvido uma palestra no FILS 6 sobre o quanto Ruby é simples e robusto, percebo que há tempos Ruby sobre o fmwk Rails vem crescendo significativamente.
Hoje, programo usando algumas tecnologias JEE tais como JavaServer Pages, Servelet's, Java Standard Tag Libs (JSTL).
Acredito que o Ruby ainda vai dar muito o que falar devido a sua robustez e simplicidade aliado à OO em perfeito sincronismo c/ o frame.

Vamos ver no que dá...

Abraços!

terça-feira, agosto 22, 2006

Liberada a versão Slackware 11.0 Release Candidate 2

Lançada oficialmente a versão do Slackware 11.0 Release Candidate 2. Esta é última release antes do lançamento oficial do Slackware 11.0.Muitos bugs foram corrigidos e muitas atualizações foram feitas nesta na nova versão. Mudanças recentes incluem atualização para o kernel 2.4.33 (em vez do kernel 2.4.31), atualização para o recente kernel 2.6.19, atualizações de muitos binários no instalador e correções de alguns bugs e falhas de segurança.Slackware Linux é o nome de uma das mais antigas e conhecidas distribuições (sistema operacional e conjunto de aplicativos) do Linux. Criada em 1993 e mantida por Patrick Volkerding, a Slackware (ou simplesmente "Slack") tem como objetivo manter-se fiel aos padrões UNIX, rejeitando também ferramentas de configuração que escondam do usuário o real funcionamento do sistema.

Download aqui

sexta-feira, julho 28, 2006

Slackware 11" esta perto

Estamos chegando perto do 11.0 amigos. Espero ter um changeset maior logo, mas por enquanto isto deve ser legal para 'brincar', enquanto trabalho na lista de afazeres; atualizando, compilando e com testes iniciais.", diz Patrick Volkerding no changelog do 'current'. O Slackware 11.0 considerará a série 2.6.16.x do kernel como suportada, mas Patrick informa que deverá manter o bare.i do kernel 2.4.32 como default (ou talvez sata.i) pela ótima performance e provavelmente melhor segurança devido ao design mais simples e mais testado.
Patrick finaliza agradecendo à esposa por ter compilado os pacotes desta última atualização.

Maiores informações em:
http://www.noticiaslinux.com.br/nl1153107394.html
Fonte Original (inglês): http://www.slackware.org/changelog/current.php?cpu=i386
Leia mais em http://www.underlinux.com.br/content/view/6135/59/

quinta-feira, julho 13, 2006

Instalando e Configurando Modem Motorola SM56 - Adaptado

Instalando e Configurando Modem Motorola SM56 Imprimir
24 de março de 2005
Este documento tem como objetivo, auxiliar os usuarios do Modem sm56 da Motorola a instalarem esse modem no Linux.
1.0 - SOBRE ESTE DOCUMENTO
2.0 - INTRODUÇÃO
3.0 - O QUE É NECESSÁRIO?
4.0 - INSTALANDO.
5.0 - SE SEU KERNEL É MAIOR QUE 2.4.5
6.0 - POSSÍVEIS PROBLEMAS
7.0 - CONCLUSÃO


1.0 - SOBRE ESTE DOCUMENTO
Este documento é distribuí­do gratuitamente, seguindo
o FDL, e pode
ser distribuí­do e alterado, desde que você cite a
fonte. Você é bem vindo se quiser colaborar.

2.0 - INTRODUÇÃO

A mais ou menos um ano e meio atrás, foi criado um
artigo, e divulgado amplamente, sobre como
instalar e configurar o Modem sm56 da Motorola.
Na época, o kernel 2.4.0 havia acabado de ser
lançado, e a Motorola lancou o driver para tal modem,
sendo que foi unica e exclusivamente testado com o Red
Hat Linux 7.1.
Acontece que, como é costume no mundo do Software
Livre, as coisas andam depressa, e a cada semana e
a cada mês, surgem atualizações e correções.
Infelizmente, a Motorola nao conseguiu seguir o mesmo
ritmo, seja por falta de interesse ou por
qualquer outro motivo.
O que importa realmente, é que vários usuários
ficaram sem suporte,quando viram que o driver não
funcionava nas versões de kernel mais novas e acima do
2.4.5.
Na época, recebi vários e-mail's e continuo a
recebê-los, pedindo maiores detalhes sobre como
instalar e fazer funcionar tal modem.
Agora, com a ajuda de alguns amigos, finalmente é
possível configurar o modem para que ele funcione
em um kernel diferente do 2.4.5.
Agradecimentos a todos aqueles que me enviaram e-mail
e ao meu amigo Massimiliano Mirra.
Agradecimento especial a minha esposa Brenna. Ela é
minha revisora oficial ;^).

3.0 - O QUE É NECESSÁRIO?

Inicialmente, a primeira coisa a fazer, é ver sob
qual kernel seu sistema estatrabalhando.
Use o comando uname -r. Se este comando retornar um
kernel menor ou igual ao 2.4.5, vai até
a página da Motorola (www.Motorola.com) e pegue o
driver para o modem.
Caso o kernel seja maior do que o mencionado acima,
vá para seção
"5.0 - SE SEU KERNEL É MAIOR QUE 2.4.5".
Outra coisa que você deverá observar, é ter um
ambiente de desenvolvimento GNU instalado em seu
sistema, já que precisaremos dele para compilar o
driver corretamente.
Verifique, com o comando rpm -qa | grep gcc, se o
compilador GNU C está instalado.
Faça o mesmo para o cpp: rpm -qa | grep cpp.
Se você possuir um kernel acima do 2.4.5, você deverá
ter as fontesdo kernel do seu sistema insta-
lado, bem como o make, o automake, o autoconf, o tcl,
e o ncurses, pois teremos que recompilar o kernel.

4.0 - INSTALANDO

Esta parte diz respeito aqueles que tem um kernel
menor ou igual ao 2.4.5.
Uma vez efetuado o download e, como root, instale-o
com rpm -ivh sm56xxxx-i386.rpm.
Após, digite man sm56 e procure por qual código o seu
País se encaixa.
A lista é um pouco extensa:

1 = USA
2 = Canada
27 = South Africa
30 = Greece
31 = Netherlands
32 = Belgium
33 = France
34 = Spain
39 = Italy
41 = Switzerland
42 = Czech Republic
43 = Austria
44 = United Kingdom
45 = Denmark
46 = Sweden
47 = Norway
49 = Germany
52 = Mexico
54 = Argentina
55 = Brazil
57 = Columbia
58 = Venezuela
60 = Malaysia
61 = Australia
64 = New Zealand
65 = Singapore
66 = Thailand
81 = Japan
82 = Korea
84 = Vietnam
86 = China
90 = Turkey
351 = Portugal
352 = Luxembourg
353 = Ireland
354 = Iceland
358 = Finland
852 = Hong Kong
886 = Taiwan
962 = Jordan
972 = Israel

Depois que você instalar o driver, digite sm56setup,
seguido do
código do seu País.
Naturalmente para nós que moramos no Brasil, o código
escolhido será o 55.
Se este código for omitido será atribuí­do o código
padrão: 1 (USA).
O comando sm56setup compila o módulo que controla o
modem, adequado para seu kernel, que será
instalado em /lib/modules/[seu
kernel]/kernel/drivers/char.
O comando também adequa o seu /etc/modules.conf, que
ficará assim:

.......
.......
alias char-major-24 sm56
options sm56 country=1 ---> aqui poderá ser colocado o
código apropriado.

Ele também cria um dispositivo em /dev, chamando
sm56, criando um link para o /dev/modem, que aponta
para este dispositivo, bem como seta as permissões
adequadas.
Digite modprone sm56 e pronto, seu modem está
instalado!
Se seu kernel é superior ao 2.4.5, passe ao próximo
tópico.

5.0 - SE O KERNEL É MAIOR DE 2.4.5.

Primeiramente, quero agradecer ao meu amigo
Massimiliano Mirra, que me enviou esta dica.
Se você está usando uma distribuição moderna, como
Conectiva Linux8.0, Red Hat Linux 8.0,
Mandrake Linux 9.0 ou Slackware Linux 8.1, saiba que o
modem sm56 pode funcionar sob um kernel mais recente.
Estas distribuições citadas, a exceção do Mandrake
Linux 9.0, trazem um kernel 2.4.18.
Para este documento, eu utilizei o Mandrake 9.0, com
kernel 2.4.19.
Como comentado acima, será necessário fazer algumas
alteraçõesnas fontes do kernel e recompilá-lo
para que o modem funcione corretamente.
Vá até onde as fontes do kernel estão instaladas
(geralmente /usr/src/linux-2.4.X).
Entre no diretório mm.
Neste diretório estão as fontes para o tratamento da
memória.
Procure por um arquivo chamado slab.c.
Este arquivo deve ser alterado.
Abra-o com seu editor de texto.
Não darei explicações do por que ele deverá ser
alterado, pois nãosou um craque em programação C,
mas acho que deve ter algo com relação com a alocação
da memória pelo driver do Motorola.
Se alguém tiver alguma explicação e quiser
enviar, será prontamenteincluí­da nesta
documentação.
Vá até a linha 1116, e comente-a:

Ela está assim:
if (flags & ~(SLAB_DAM|SLAB_LEVEL_MASK|SLAB_NO_GROW))
BUG();
E deve ficar assim:
/* if (flags &
~(SLAB_DAM|SLAB_LEVEL_MASK|SLAB_NO_GROW))
BUG(); */

Depois disso, grave o arquivo e vamos compilar o
kernel.
Digite make menuconfig.
Perceba que se você não tiver o ncurses instalado,
este comando irá falhar.
Irá aparecer, depois de alguns momentos, um menu
baseado em ncurses,com botões, caixas e diálogos,
para que possamos escolher as opçÕes do kernel.
Recomendo fortemente que você deixe o seu kernel o
mais enxuto possí­vel.
Por exemplo, escolha um processador de acordo com a
sua máquina:se você tem um AMD, não faz
sentido escolher um Pentium MMX, pois alguns
parâmetros do processador poderá fazer diferença.
Tire tudo o que não for necessário para sua máquina:
bluetooth, PCMCIA, USB, entre outros, anão ser
que tais suportes sejam requeridos pelo seu sistema.
Outra idéia: se você não tem nenhuma placa de rádio e
não planeja adquirir uma, não há
necessidade de compilar um módulo para suportar tal
placa.
Outro suporte desnecessário em máquinas caseiras, é
suporte a ATM, a FDDI (fibra óptica), WAN,
APPLETALK, IPX, DECNET, etc., quando não é um
requisito essencial.
Retire tudo o que não seja estritamente necessário.
Depois de escolhidas as opções, tecle TAB, até cair
na opção Exit.
Tecle ENTER e será perguntado se você quer salvar as
alteraçÕes. Escolha SIM.
Agora digite make dep para criar as dependências
necessárias para compilar o kernel.
Depois que o comando se completar, digite make
bzImage, para construir a imagem do kernel.
Depois, digite make modules e make modules_install,
para construir e instalar os módulos
do novo kernel.
Pode sair para um cafezinho agora, pois este
comando poderá demorar, dependendo do porte de sua
máquina.
Terminado o comando anterior, o seu kernel estará em
/usr/src/linux-2.4.X/arch/i386/boot, com o nome
de bzImage.
Copie-o para o diretório /boot, dando-lhe outro nome,
como vmlinuz-custom.
Copie também o System.map, que está em
/usr/src/linux-2.4.X/System.map, para o diretório
/boot,
com um nome diferente, como System.map-custom.
No mesmo diretório, há um arquivo oculto chamando
.config.
Digite ls -a, para visualizá-lo.
Copie-o também para o diretório /boot, com um nome
diferente, como config-custom.
Entre no diretório
/usr/src/linux-2.4.X/include/linux.
Copie o arquivo kernel.h, para o diretório /boot, com
um nome diferente, algo como kernel.h-custom.
Agora, vá para o diretório /boot, e faça as
alterações necessárias.
Apague os links seguintes:
rm -rf config, rm -rf System.map, rm -rf vmlinuz e rm
-rf kernel.h
Crie agora os links para os arquivos novos:
ln -s config-custom config
ln -s System.map-custom System.map
ln -s vmlinuz-custom vmlinuz e por último
ln -s kernel.h-custom kernel.h

Agora, temos que alterar o arquivo /etc/lilo.conf, se
você estiver usando o LILO, como gerenciador
de inicalização.
Ele deve se parecer com isso:

boot=/dev/hda
map=/boot/map
vga=normal
default=linux
keytable=/boot/us-latin1.klt
prompt
nowarn
#vga = 791
timeout=100
message=/boot/message
menu-scheme=wb:bw:wb:bw
image=/boot/vmlinuz ---------------------------
label=linux |
root=/dev/hda1 |
# initrd=/boot/initrd.img | -> É aqui que devemos
fazer a alteração,
append="devfs=mount" | colocando o nome do kernel
(vmlinuz).
vga=791 | Comente a linha initrd, pois ela diz

read-only ------------------------------ respeito
somente ao kernel velho.

image=/boot/vmlinuz-seu-kernel-original-------------------
label=linux-nonfb |
root=/dev/hda1 | -> Mantenha esta linha,
alterando
initrd=/boot/initrd.img | apenas o vmlinuz, para
o nome com-
append="devfs=mount" | pleto do
seu kernel velho.
read-only-----------------------------------------
other=/dev/hdb2
label=windows
table=/dev/hdb
map-drive=0x80
to=0x81
map-drive=0x81
to=0x80
other=/dev/fd0
label=floppy
unsafe

Se você estiver usando o GRUB, altere as linhas
correspondentes.
Digite lilo, para que as alterações tenham efeitos.
É importante manter uma imagem do seu kernel
anterior, pois se alguma coisa não der certo,
você terá como inicializar seu sistema.
Reinicie a sua máquina, e espere ela inicializar com
o kernel novo.
Se tudo der certo, você deverá estar com seu kernel
recém compilado.
Para ter certeza, digite :
cat /proc/version.
Deve aparecer algo do tipo:

Linux version 2.4.19-16mdkcustom ( root@scoob.doo.comEste endereço de e-mail está sendo protegido de spam, você precisa de Javascript habilitado para vê-lo )

(gcc version 2.96 20000731 (Mandrake Linux 9.0
2.96-0.80mdk)) #1 Seg Dez 16 18:02:34 BRST 2002

Agora proceda da mesma maneira que no item 4.0.
Perceba que após o modprobe sm56, o driver não ficará
mais com aquela mensagem de initializing.
Verifique isto com lsmod.

Pronto! Seu modem está funcionando.
NOTA: Recebi informaçÕes que no kernel 2.4.20 e
superiores, não é necessário editar o arquivo
/usr/src/linux-2.4.20/mm/slab.c. Eu nãoo testei com
este kernel ainda. Assim que testá-lo, estarei
repassando,
ou alguém pode fazé-lo, certo?

6.0 - POSSÍVEIS PROBLEMAS.

I - Ao inicilizar, meu kernel diz "kernel panic .....
". O que é isso?

Esta mensagem aparece se seu kernel foi compilado sem
suporte ao seu sistema de arquivos do raí­z.
Por exemplo, se sua raí­z é XFS, e no kernel o
suporte ao XFS é via módulo, compile seu
kernel como suporte XFS intrínseco. O padrão do kernel
é assim:

SGI XFS filesystem support

[*] Enable XFS Realtime support

[*] Enable XFS Quota

Enable XFS DMAPI


Mude para:
SGI XFS filesystem support

[*] Enable XFS Realtime support

[*] Enable XFS Quota

Enable XFS DMAPI


Isto fará que o suporte ao XFS seja parte integrante
do kernel, não precisando de nenhum módulo
ser carregado.

II - Minha máquina trava quanto executo o minicom
ou outro aplicativo de dial-up. Por que?

Por motivos que desconheço, o modem Motorola não
gosta de ter outra porta serial habilitada.
Entre no setup da sua máquina, e deixe somente uma
porta serial habilitada, aquela correspondente
a seu mouse. Isso deverá resolver o problema.

III - Quando digito minicom ou uso o kppp, ele diz que
o /dev/modem não existe. E agora?

Se o /dev/modem não existir, pode ter ocorrido alguma
falha com o comando sm56setup.
Para não ter que executá-lo de novo, vá até o
diretório /dev , e crie o links para o dispositivo
/dev/sm56: ln -s sm56 modem.
Caso tal dispositivo não exista, crie com o comando
mknod /dev/sm56 c 24 0, e mude o dono/grupo e
as permissões, com o comando chown uucp.root /dev/sm56
e chmod a+rw /dev/sm56, respectivamente.


7.0 - CONCLUSÃO.

Bom eu acho que é isso.
Eu consegui fazer este modem funcionar em um Mandrake
Linux 9.0, recompilando o kernel 2.4.19.
Acredito que você também pode fazê-lo. Obrigado a
todos e continuem me mandando e-mail, pois farei
o possível para ler e responder a todos. Até +.

Gilberto Nunes
gilbertonunes@yahoo.com.brEste endereço de e-mail está sendo protegido de spam, você precisa de Javascript habilitado para vê-lo
Comentarios

sexta-feira, junho 16, 2006

Stelth Linux

Stelth Linux -

http://stelth.no-ip.org

Muito mais do que apenas um repositório do conhecimento!

Bandwidth Limiting HOWTO - Inglês

Pessoal, estou trabalhando num projeto de documentação que trata especificamente sobre Controle de Banda, e encontrei um tutorial, um pouco antigo, sobre o assunto. Portanto vou disponibilizá-lo aqui, em inglês, para todos terem acesso!

-------------------------------------------------------------------------------------------------------------------------------------------

Bandwidth Limiting HOWTO
Tomasz Chmielewski

tch@writemail.com
Revision History
Revision 0.1 2001-05-02 Revised by: tc
Initial release.

This document describes how to set up your Linux server to limit download bandwidth or incoming traffic and how to use your internet link more efficiently.

Table of Contents
1. Introduction

1.1. New versions of this document
1.2. Disclaimer
1.3. Copyright and License
1.4. Feedback and corrections

2. Before We Start

2.1. What do we need
2.2. How does it work?

3. Installing and Configuring Necessary Software

3.1. Installing Squid with the delay pools feature
3.2. Configuring Squid to use the delay pools feature
3.3. Solving remaining problems

3.3.1. Linux 2.2.x kernels (ipchains)
3.3.2. Linux 2.4.x kernels (iptables)

4. Dealing with Other Bandwidth-consuming Protocols Using CBQ

4.1. FTP
4.2. Napster, Realaudio, Windows Media and other issues

5. Frequently Asked Questions

5.1. Is it possible to limit bandwidth on a per-user basis with delay pools?
5.2. Is it possible to limit bandwidth on a per-user basis with cbq.init script?
5.3. Delay pools are stupid; why can't I download something at full speed when the network is used only by me?
5.4. CBQ is stupi; why can't I download something at full speed when the network is used only be me?

6. Miscellaneous

6.1. Useful resources

1. Introduction

The purpose of this guide is to provide an easy solution for limiting incoming traffic, thus preventing our LAN users from consuming all the bandwidth of our internet link.

This is useful when our internet link is slow or our LAN users download tons of mp3s and the newest Linux distro's *.iso files.
1.1. New versions of this document

You can always view the latest version of this document on the World Wide Web at the URL http://www.linuxdoc.org.

New versions of this document will also be uploaded to various Linux WWW and FTP sites, including the LDP home page at http://www.linuxdoc.org.
1.2. Disclaimer

Neither the author nor the distributors, or any other contributor of this HOWTO are in any way responsible for physical, financial, moral or any other type of damage incurred by following the suggestions in this text.
1.3. Copyright and License

This document is copyright 2001 by Tomasz Chmielewski, and is released under the terms of the GNU Free Documentation License, which is hereby incorporated by reference.
1.4. Feedback and corrections

If you have questions or comments about this document, please feel free to mail Tomasz Chmielewski at tch@writemail.com. I welcome any suggestions or criticisms. If you find a mistake or a typo in this document (and you will find a lot of them, as English is not my native language), please let me know so I can correct it in the next version. Thanks.

2. Before We Start

Let's imagine the following situation:

*

We have 115,2 kbits/s ppp (modem) internet link (115,2/10 = 11,5 kbytes/s); yes, there are such types of connection! With eth connections (network card) we divide 115,2 by 8; with ppp we divide by 10, because of start/stop bits (8 + 1 + 1 = 10).
*

We have some LAN stations and their users are doing bulk downloads all the time.
*

We want web pages to open fast, no matter how many dowloads are happening.
*

Our internet interface is ppp0.
*

Our LAN interface is eth0.
*

Our network is 192.168.1.0/24

2.1. What do we need

Believe it or not, shaping the incoming traffic is an easy task and you don't have to read tons of books about routing or queuing algorithms.

To make it work, we need at least Squid proxy; if we want to fine tune it, we will have to get familiar with ipchains or iptables and CBQ.

To test our efforts, we can install IPTraf.
2.2. How does it work?

Squid is probably the most advanced HTTP proxy server available for Linux. It can help us save bandwidth in two ways:

*

The first is a main characteristic of proxy servers -- they keep downloaded web pages, pictures, and other objects in memory or on a disk. So, if two people are requesting the same web page, it isn't downloaded from the internet, but from the local proxy.
*

Apart from normal caching, Squid has a special feature called delay pools. Thanks to delay pools, it is possible to limit internet traffic in a reasonable way, depending on so-called 'magic words', existing in any given URL. For example, a magic word could be '.mp3', '.exe' or '.avi', etc. Any distinct part of a URL (such as .avi) can be defined as a magic word.

With that, we can tell the Squid to download these kinds of files at a specified speed (in our example, it will be about 5 kbytes/s). If our LAN users download files at the same time, they will be downloaded at about 5 kbytes/s altogether, leaving remaining bandwidth for web pages, e-mail, news, irc, etc.

Of course, the Internet is not only used for downloading files via web pages (http or ftp). Later on, we will deal with limiting bandwidth for Napster, Realaudio, and other possibilities.

3. Installing and Configuring Necessary Software

Here, I will explain how to install the necessary software so that we can limit and test the bandwidth usage.
3.1. Installing Squid with the delay pools feature

As I mentioned before, Squid has a feature called delay pools, which allows us to control download bandwidth. Unfortunately, in most distributions, Squid is shipped without that feature.

So if you have Squid already installed, I must disappoint you -- you need to uninstall it and do it once again with delay pools enabled in the way I explain below.

1.

To get maximum performance from our Squid proxy, it's best to create a separate partition for its cache, called /cache/. Its size should be about 300 megabytes, depending on our needs.

If you don't know how to make a separate partition, you can create the /cache/ directory on a main partition, but Squid performance can suffer a bit.
2.

We add a safe 'squid' user:

# useradd -d /cache/ -r -s /dev/null squid >/dev/null 2>&1

No one can log in as squid, including root.
3.

We download Squid sources from http://www.squid-cache.org

When I was writing this HOWTO, the latest version was Squid 2.4 stable 1:

http://www.squid-cache.org/Versions/v2/2.4/squid-2.4.STABLE1-src.tar.gz
4.

We unpack everything to /var/tmp:
5.

# tar xzpf squid-2.4.STABLE1-src.tar.gz
6.

We compile and install Squid (everthing is in one line):

# ./configure --prefix=/opt/squid --exec-prefix=/opt/squid --enable-delay-pools --enable-cache-digests --enable-poll --disable-ident-lookups --enable-truncate --enable-removal-policies

# make all

# make install

3.2. Configuring Squid to use the delay pools feature

1.

Configure our squid.conf file (located under /opt/squid/etc/squid.conf):

#squid.conf
#Every option in this file is very well documented in the original squid.conf file
#and on http://www.visolve.com/squidman/Configuration%20Guide.html

#
#The ports our Squid will listen on
http_port 8080
icp_port 3130
#cgi-bins will not be cached
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
#Memory the Squid will use. Well, Squid will use far more than that.
cache_mem 16 MB
#250 means that Squid will use 250 megabytes of disk space
cache_dir ufs /proxy 250 16 256
redirect_rewrites_host_header off
cache_replacement_policy GDSF
acl localnet src 192.168.1.0/255.255.255.0
acl localhost src 127.0.0.1/255.255.255.255
acl Safe_ports port 80 443 210 119 70 21 1025-65535
acl CONNECT method CONNECT
acl all src 0.0.0.0/0.0.0.0
http_access allow localnet
http_access allow localhost
http_access deny !Safe_ports
http_access deny CONNECT
http_access deny all
maximum_object_size 3000 KB
store_avg_object_size 50 KB

#all our LAN users will be seen by external servers
#as if they all use Mozilla on Linux :)
anonymize_headers deny User-Agent
fake_user_agent Mozilla/5.0 (X11; U; Linux 2.4.4 i686)

#To make our connection even faster, we put a line similar
#to the one below. Don't forget to change the server to your closest!
#Measure pings, traceroutes and so on.
#Make sure that http and icp ports are correct
#cache_peer w3cache.icm.edu.pl parent 8080 3130 no-digest default

#This is useful when we want to use the Cache Manager
#copy cachemgr.cgi to cgi-bin of your www server
cache_mgr your@email
cachemgr_passwd secret_password all

#This is a name of a user our Squid will work as
cache_effective_user squid
cache_effective_group squid

log_icp_queries off
buffered_logs on


#####DELAY POOLS
#This is the most important part for shaping incoming traffic with Squid
#For detailed description see squid.conf file or docs at http://www.squid-cache.org

#We don't want to limit downloads on our local network
acl magic_words1 url_regex -i 192.168

#We want to limit downloads of these type of files
#Put this all in one line
acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .tar.gz .gz .rpm .zip .rar .avi .mpeg .mpe .mpg .qt
.ram .rm .iso .raw .wav
#We don't block .html, .gif, .jpg and similar files, because they
#generally don't consume much bandwidth

#We have two different delay_pools
delay_pools 2

#First delay pool
#W don't want to delay our local traffic
#There are three pool classes; here we will deal only with the second
delay_class 1 2

#-1/-1 mean that there are no limits
delay_parameters 1 -1/-1 -1/-1

#magic_words1: 192.168
delay_access 1 allow magic_words1

#Second delay pool
#we want to delay downloading files mentioned in magic_words2
delay_class 2 2

#The numbers here are values in bytes;
#we must remember that Squid doesn't consider start/stop bits
#6000/150000 are values for the whole network
#5000/150000 are values for the single IP
#after downloaded files exceed about 150000 bytes,
#they will continue to download at about 5000 bytes/s

delay_parameters 2 6000/150000 5000/150000
delay_access 2 allow magic_words2

#EOF

OK, when we have configured everything, we must make sure everything under /opt/squid and /cache directories belongs to user 'squid'.

# chown -R squid:squid /opt/squid/

# chown -R squid:squid /cache/

or

# chown -R squid.squid /opt/squid/

# chown -R squid.squid /cache/

Now everything is ready to run Squid. When we do it for the first time, we have to create its cache directories:

# /opt/squid/usr/bin/squid -z

We run Squid and check if everything is working. A good tool to do that is IPTraf; you can find it on http://freshmeat.net. Make sure you have set the appropriate proxy in your web browsers (192.168.1.1, port 8080 in our example):

# /opt/squid/usr/bin/squid

If everything is working, we add /opt/squid/usr/bin/squid line to the end of our initializing scripts. Usually, it can be /etc/rc.d/rc.local.

Other helpful options in Squid may be:

# /opt/squid/usr/bin/squid -k reconfigure (it reconfigures Squid if we made any changes in its squid.conf file)

# /opt/squid/usr/bin/squid -help :) self-explanatory

You can also copy cachemgr.cgi to the cgi-bin directory of your WWW server.

3.3. Solving remaining problems

OK, we have installed Squid and configured it to use delay pools. I bet nobody wants to be restricted, especially our clever LAN users. They will likely try to avoid our limitations, just to download their favourite mp3s a little faster (and thus causing your headache).

I assume that you use IP-masquerade on your LAN so that your users can use IRC, ICQ, e-mail, etc. That's OK, but we must make sure that our LAN users will use our delay pooled Squid to access web pages and use ftp.

We can solve most of these problems by using ipchains (Linux 2.2.x kernels) or iptables (Linux 2.4.x kernels).
3.3.1. Linux 2.2.x kernels (ipchains)

We must make sure that nobody will try to cheat and use a proxy server other than ours. Public proxies usually run on 3128 and 8080 ports:

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 3128 -p TCP -j REJECT

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 8080 -p TCP -j REJECT

We must also make sure that nobody will try to cheat and connect to the internet directly (IP-masquerade) to download web pages:

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 http -p TCP -j REDIRECT 8080

/sbin/ipchains -A input -s ! 192.168.1.1 -d ! 192.168.1.1 https -p TCP -j REDIRECT 8080

If everything is working, we add these lines to the end of our initializing scripts. Usually, it can be /etc/rc.d/rc.local.

We might think to block ftp traffic (ports 20 and 21) to force our LAN users to use Squid, but it's not a good idea for at least two reasons:

*

Squid is a http proxy with ftp support, not a real ftp proxy. It can download from ftp, it can also upload to some ftp, but it can't delete/change name of files on remote ftp servers.

When we block ports 20 and 21, we won't be able to delete/change name of files on remote ftp servers.
*

IE5.5 has a bug (at least mine has) -- it doesn't use a proxy to retrieve the ftp directory. Instead it connects directly via IP-masquerade.

When we block ports 20 and 21, we won't be able to browse through ftp directories, using IE5.5.

So, we will block excessive ftp downloads using other methods. We will deal with it in chapter 4.
3.3.2. Linux 2.4.x kernels (iptables)

FIXME: Unfortunately, I don't know much about IP-tables, please help :(((

4. Dealing with Other Bandwidth-consuming Protocols Using CBQ

We must remember that our LAN users can spoil our efforts from chapter 3, if they use Napster or Realaudio. We must also remember that we didn't block ftp traffic in section 3.3.

We will achieve it in a different way -- not by limiting downloading directly, but rather, indirectly. If our internet device is ppp0 and LAN device is eth0, we will limit outgoing traffic on interface eth0, and thus, limit incoming traffic to ppp0.

To do it, we will get familiar with CBQ and cbq.init script. You can obtain it from ftp://ftp.equinox.gu.net/pub/linux/cbq/. Download cbq.init-v0.6.2 and put it in /etc/rc.d/.

You will also need iproute2 installed. It comes with every Linux distribution.

Now look in your /etc/sysconfig/cbq/ directory. There, you should have an example file, which should work with cbq.init. If it isn't there, you probably don't have it compiled in your kernel.
4.1. FTP

In chapter 3, we didn't block ftp for two reasons -- so that we could do uploads, and so that users with buggy IE5.5 could browse through ftp directories. In all, our web browsers and ftp programs should make downloads via our Squid proxy and ftp uploads/renaming/deleting should be made via IP-masquerade.

We create a file called cbq-10.ftp-network in the /etc/sysconfig/cbq/ directory:

# touch /etc/sysconfig/cbq/cbq-10.ftp-network

We insert the following lines into it:

DEVICE=eth0,10Mbit,1Mbit
RATE=10Kbit
WEIGHT=1Kbit
PRIO=5
RULE=:20,192.168.1.0/24
RULE=:21,192.168.1.0/24

You will find the description of thses lines in cbq.init-v0.6.2 file.

When you start /etc/rc.d/cbq.init-v.0.6.2 script, it will read your configuration, which is in /etc/sysconfig/cbq/:

# /etc/rc.d/cbq.init-v.0.6.2 start

If everything is working, we add /etc/rc.d/cbq.init-v.0.6.2 start to the end of your initializing scripts. Usually, it can be /etc/rc.d/rc.local.

Thanks to this command, your server will not send ftp data through eth0 faster than 10kbits/s, and thus will not download ftp data faster than 10kbits/s. Your LAN users will see that it's more efficient to use Squid proxy for doing ftp downloads. They will be also able to browse ftp directories using their buggy IE5.5.

There is also another bug in IE5.5 - when you right click on a file in a ftp directory then select 'Copy To Folder', the file is downloaded not through proxy, but directly through IP-masquerade, thus omitting Squid with delay pools.
4.2. Napster, Realaudio, Windows Media and other issues

Here, the idea is the same as with ftp; we just add another port and set a different speed.

We create file called cbq-50.napster-network in the /etc/sysconfig/cbq/ directory:

# touch /etc/sysconfig/cbq/cbq-50.napsterandlive

Put these lines into that file:

DEVICE=eth0,10Mbit,1Mbit
RATE=50Kbit
WEIGHT=5Kbit
PRIO=5
#Windows Media Player
RULE=:1755,192.168.1.0/24
#Real Player uses TCP port 554 or UDP ports near 3369, I don't know exactly
RULE=:554,192.168.1.0/24
RULE=:3360,192.169.1.0/24:3380
#Napster uses ports 6699 and 6700, maybe some other?
RULE=:6699,192.168.1.0/24:6799
#Add any other ports you want; you can easily check
#ports that programs use with IPTraf
#RULE=:from_port,192.168.1.0/24:to_port

5. Frequently Asked Questions
5.1. Is it possible to limit bandwidth on a per-user basis with delay pools?

Yes. Look inside the original squid.conf file and check the Squid documentation on http://www.squid-cache.org
5.2. Is it possible to limit bandwidth on a per-user basis with cbq.init script?

Yes. Look inside this script; there are some examples.
5.3. Delay pools are stupid; why can't I download something at full speed when the network is used only by me?

Unfortunately, you can't do much about it.

The only thing you can do is to use cron and reconfigure it, for example, at 1.00 am, so that Squid won't use delay pools, then reconfigure it again, let's say at 7.30 am, to use delay pools.
5.4. CBQ is stupi; why can't I download something at full speed when the network is used only be me?

Lucky you, it's possible!

There are to ways to achieve it.

The first is the easy one, similar to the solution we made with Squid. To do that, just look inside the cbq.init script.

The second way is harder, but more intelligent. You can read about it in the Linux 2.4 Advanced Routing HOWTO.

6. Miscellaneous
6.1. Useful resources

Squid Web Proxy Cache

http://www.squid-cache.org

Squid 2.4 Stable 1 Configuration manual

http://www.visolve.com/squidman/Configuration%20Guide.html

http://www.visolve.com/squidman/Delaypool%20parameters.htm

Squid FAQ

http://www.squid-cache.org/Doc/FAQ/FAQ-19.html#ss19.8

cbq-init script

ftp://ftp.equinox.gu.net/pub/linux/cbq/

Linux 2.4 Advanced Routing HOWTO

http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html

Traffic control (in Polish)

http://ceti.pl/~kravietz/cbq/

Securing and Optimizing Linux Red Hat Edition - A Hands on Guide

http://www.linuxdoc.org/guides.html

IPTraf

http://cebu.mozcom.com/riker/iptraf/

IPCHAINS

http://www.linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html

sexta-feira, junho 09, 2006

O Linux é o melhor para você - Adaptado

Vamos começar politicamente correto. Nesta postagem eu digo 'Linux', mas estou querendo dizer GNU/Linux. Por favor, vá até http://www.gnu.org/gnu/linux-and-gnu.html para ver por quê.

Você deseja mudar do DOS/Windows para o Linux? Boa idéia: Linux é tecnicamente superiro ao DOS, Windows 9x e até mesmo o Windows NT. Mas cuidado! Ele pode não ser muito útil para você. Estas são as principais diferenças entre DOS/Windows e Linux:
Windows roda Microsoft Office e todos os jogos; é fácil de configurar e instalar; é conhecidamente instável; performance baixa; frequentemente trava.
Linux roda Star Office*; alguns jogos; pode ser complicado de instalar e configurar; é muito estável; performance impecável; travamentos são raros.

Portanto, se for pensar em estabilidade, escalabilidade, portabilidade, eficiência, segurança, e muito mais, pense no GNU/Linux.

Acredite nessa idéia!

Ajude a recriar a Informática que foi obscurecida pelos sistemas operacionais cuja a idéia foi a inclusão em detrimento de todas as qualidades dos verdadeiros Sistemas Operacionais!

quinta-feira, junho 01, 2006

Artigo Científico

Estou escrevendo um artigo científico para faculdade, mas por enquanto estou em dúvida a respeito de qual assunto tratar. Entre as possíveis idéias, o Gnu/Linux é a minha preferida, entretanto me ocorreu a idéia de fazer um artigo sobre Psicotrônica ou Psicotécnica.
Faço parte também de outro Blog cujo o assunto é voltado ao holístico, auto-ajuda, espiritualismo, etc. Visite lá para vocês verem EVOLUÇÃO.
Quanto ao meu artigo, prefiro pensar melhor e assim que tiver idéias, ou se alguém poder me clarificar, agradeço!

Daniel