Inicialmente este blog foi criado para armazenar algumas dicas e links de UNIX/Linux, OpenVMS, linguagem C, Assembly, TCP/IP e nerdezas afins. No entanto devido ao autor ter abandonado o seu plano de ser um super hacker e dominar o mundo (devido esposa, família, filhos, trabalho), a partir de 2012 este blog tem um tipo de nerdeza mais light (Android, Linux, RetroPie (retrogames), produtividade, e por aí vai). Estas dicas raramente serão criações minhas.

domingo, 29 de março de 2009

Sistemas Especialistas

O conteúdo abaixo é o que um recém aspirante a conhecedor dos princípios de Inteligência Artificial tem a dizer sobre Sistemas Baseados em Conhecimento. Estou cursando esta disciplina e o professor pediu para que comentássemos um pouco sobre este período da história da I.A.

O que balizou esta pesquisa foi um pequeno trecho Capítulo 1 do livro Inteligência Artificial do Russel e Norvig.

Fontes de consulta:
http://hci.stanford.edu/~winograd/shrdlu/
http://pt.wikipedia.org/wiki/Dendral
http://en.wikipedia.org/wiki/MYCIN

Sistemas baseados em conhecimento: a chave do poder? (1969 - 1979)
Inicialmente os estudiosos de I.A. tentavam encontrar maneiras de desenvolver mecanismos que mostrassem cada etapa do raciocínio até chegar na solução completa de qualquer problema. Ou seja um mecanismo de busca de soluções propósito geral. Como essa tentativa de resolver qualquer problema exigia uma complexidade muito grande, não era possível resolver problemas muito grandes ou muito difíceis.

Uma outra abordagem foi projetar o sistema já conhecendo a sua área de atuação. Por isso chamado de Sistemas baseados em conhecimento, ou também Sistemas Especialistas. No livro tem até uma citação interessante: "para resolver um problema difícil, é necessário praticamente já conhecer a resposta".

Um projeto pioneiro de Sistema Especialista foi o DENDRAL (Dendritic Algorithm), desenvolvido por Ed Feigenbaum, em Stanford. O DENDRAL foi desenvolvido nos anos 60 e tinha como principal objetivo auxiliar os pesquisadores de química orgânica a indetificar moléculas orgânicas desconhecidas. Não vamos aqui falar de detalhes de como o software identifica tais moléculas, só queremos dizer que ele é considerado um sistema especialista por que ele automatiza o processo de decisão e tem o mesmo comportamento de um especialista em química orgânica na resolução de problemas.

O DENDRAL é composto de dois subprogramas (escritos em LISP): Meta-Dendral e Heuristic Dendral. O Meta-Dendral é responsável por obter as regras que serão usadas pelo programa principal. O Heuristic Dendral recebe os dados obtidos nos experimentos e junto com a base de conhecimentos químicos que já tem consegue produzir um número de possíveis estruturas moleculares. [Quem conhece a estrutura básica de um programa escrito na linguagem Prolog logo lembra dela ao ver essa descrição do Dendral (fatos, regras, perguntas)].

Outro Sistema Especialista muito famoso que veio após o DENDRAL foi o MYCIN, desenvolvido por também por Feigenbaum, só que agora acompanhado de Buchanan e Dr. Edward Shortliffe. O MYCIN se diferenciava do DENDRAL em duas coisas:
- Primeiro que não havia um modelo teórico geral através do qual o MYCIN pudesse deduzir suas regras. Estas regras têm que ser adquiridas através de extensas entrevistas com especialistas, que por sua vez adquiriram o conhecimento de livros, outros especialistas ou experiência direta.
- Segundo, as regras precisavam refletir a incerteza que está associada ao conhecimento médico (espera-se que um tratamento receitado ao paciente faça-o melhorar, mas não há certeza absoluta de que isso será alcançado).

Outro Sistema Especialista muito famoso é o SHRDLU. Trata-se de um programa feito para entender a linguagem natural. Este software "dialogava" com o usuário (através de teclado/monitor) a respeito de um pequeno mundo de blocos. O usuário pode comandar o computador a, por exemplo, pegar a menor pirâmide e colocar em cima do bloco verde. O SHRDLU é considerado um sistema especialista pois consegue realizar o processamento da linguagem natural, porém só consegue "conversar" sobre o seu mundo dos blocos. [Talvez se alguém tivesse disposição para projetar o "mundo das rodovias", poderíamos fazer o nosso motorista de taxi autônomo entender a linguagem natural e conversar com os passageiros].

O crescimento destas e de outras aplicações a problemas do mundo real causou uma demanda por esquemas úteis de representação do conhecimento. E isso acabou levando ao desenvolvimento de diversas linguagens para representar a racionalidade. Sendo o Prolog uma das linguagens que foi desenvolvida nesta época.

sexta-feira, 20 de março de 2009

Acessando arquivos compartilhados do Windows no Linux

Para acessar os arquivos compartilhados em uma máquina Windows na rede através do Linux das duas maneiras descritas a seguir é necessário ter instalado smbclient e smbfs.

usando smbclient
Essa eu vi em http://suporte.bs2.com.br/questions/1/Copiar+arquivos+de+uma+maquina+Windows+via+smbclient.

O acesso se dá através da linha de comando bem estilo ftp. Quebra um galho legal quando não temos acesso de superusuário.

Para listar os recursos compartilhados do windão fazemos o seguinte:


prompt$ smbclient -L ip_da_maquina_windows

Agora para acessar os arquivos, por exemplo, fazemos o seguinte:

prompt$ smbclient //ip_da_maquina_windows/SharedDocs

Se der tudo certo teremos um prompt estilo "smb /> ". Daí é só usar put, get, dir, mput, mget, prompt, recurse e principalmente o help.

Para copiar toda uma árvore de diretórios, basta usar prompt e recurse, em seguida mget ou mput.

usando smbmount
Essa eu pesquei em http://www.vivaolinux.com.br/artigo/Montando-um-compartilhamento-com-o-smbmount/

Quando se tem acesso de superusuário pode-se montar diretório compartilhado do windão em um ponto local do Linux e navegar normalmente como se fosse um diretório local.

Para isto fazemos:

prompt# smbmount //ip_da_maquina_windows/SharedDocs /mnt

Prontinho, se tudo der certo basta navegar pelo diretório /mnt.

quinta-feira, 19 de março de 2009

DHCP + NAT = Servidor de Internet

A configuração do dhcp eu li só esta pequena pincelada sem nenhum aprofundamento teórico: http://www.guiadohardware.net/tutoriais/servidor-linux-domestico/pagina4.html.

Essa pérola sobre o NAT eu li em http://www.revsys.com/writings/quicktips/nat.html.

A seguir é uma adaptação destas dicas para as minhas necessidades.

Cenário
Essa necessidade surgiu para mim quando eu passei a TER que usar conexão 3G por não chegar ADSL na minha nova moradia. Só que esse lance de ter um modem 3G tipo um pendrive é uma coisa meio individualista, e eu estava acostumado a ter a minha redezinha com vários computadores conectados a internet pra toda a família.

Pois bem, uma solução rápida e rasteira que encontrei foi me conectar a internet com meu laptop (Ubuntu GNU/Linux), conectar meu laptop na redezinha local (para isso é necessário um HUB ou algo do tipo), habilitar um servidor DHCP no laptop e habilitar NAT no laptop. Pronto! Tenho um servidor de internet!

É claro que não é muito interessante fazer isso em redes grandes! Na verdade eu só testei servindo internet para apenas um computador além do laptop com o GNU/Linux, mas não vejo problemas em servir para mais unzinho (dividir com mais de três deve tornar a navegação muito irritante).

Como Fazer
Só lembrando: estou conectado a internet via modem 3G utilizando a porta USB e tenho a interface ethernet livre.

Certifique-se que o dhcpd está instalado:


apt-get install dhcp3-server


Depois crie um arquivo de configuração para o dhcpd. Eu criei um arquivo chamado mdhcpd.conf da seguinte maneira (qualquer dúvida, olhar a fonte de consulta):

# Configuração do dhcpd para se tornar um servidor de internet
# para a rede local.
#
# feito por meleu, março/2009
#
# fonte de consulta:
# http://www.guiadohardware.net/dicas/configurando-servidor-dhcp.html
#

##########
ddns-update-style none;

# Tempo em segundos para revalidação dos endereços IP
default-lease-time 600;

# Tempo máximo em que uma estação usa um determinado IP
max-lease-time 86400;

# Este servidor será o servidor oficial de DHCP na rede local,
# caso contrário a diretica 'authoritative' deve ser comentada
authoritative;

# o endereço da rede local será 192.168.60
subnet 192.168.60.0 netmask 255.255.255.0 {

# os endereços IP dos clientes vai de 192.168.60.100-200
range 192.168.60.100 192.168.60.201;

# IMPORTANTE: é necessário que a interface do mubuntu com a
# rede local tenha IP 192.168.60.1
option routers 192.168.60.1;

# servidores DNS (são os que consegui pela conexão do Claro 3G)
# posteriormente posso tentar via OpenDNS
option domain-name-servers 200.169.118.22,200.169.117.22;

# broadcast, o óbvio
option broadcast-address 192.168.60.255;
}



Beleza. Até aqui eu só faço a primeira vez. As instruções daqui pra baixo é que eu faço quando quero tornar meu laptop um servidor de internet.

Primeiro defino um endereço IP para eth0. Pode ser desse jeito:

ifconfig eth0 192.168.60.1 netmask 255.255.255.0


Agora chamamos o dhcpd e dizemos para ele que o arquivo de configuração é o mdhcpd.conf:

dhcpd3 -cf mdhcpd.conf


E pra finalizar, habilitamos o NAT bem rápido e rasteiro. Vale ressaltar que eth0 é a minha interface com a rede local, e ppp0 é a interface conectada a internet (pode ser necessário fazer alguma adaptação). Qualquer dúvida, consultar a documentação do iptables.

sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT


Pronto! Agora eu e minha esposa não ficamos mais brigando para ver quem vai acessar a internet!

transformar o ubuntu no xubuntu

Gosto do Ubuntu e suas facilidades, mas gosto mais do XFCE do que o GNOME. Pra quem curte XFCE e Ubuntu tem o tal do xubuntu, mas ele tem lá as suas particularidades que eu preferi não perder muito tempo descobrindo. Simplesmente instalei o Ubuntu e transformei-o num xubuntu melhorado.

É simples demais! Após concluir a instalação do ubuntu e se conectar a internet, basta fazer:


apt-get install xubuntu-desktop


A instalação padrão do Ubuntu já vem com o OpenOffice e quando instalamos o "xubuntu-desktop" ele trás de carona o abiword e o gnumeric. Portanto, após o comando acima faça um:

apt-get remove abiword gnumeric


Tem um aplicativozinho que eu gosto de usar que é o xfce4-taskmanager que não vem quando instalamos o "xubuntu-desktop". Portanto, faça um:

apt-get install xfce4-taskmanager


Se precisar de Bluetooth na sua máquina consulte meu post: bluetooth no XFCE.

OK! Agora temos um ambiente agradável de se trabalhar!

Instalar Virtualbox atualizado via apt-get

[ESCLARECIMENTO: VirtualBox é um equivalente ao VMware porém é free (no sentido de grátis). O VMware pode até ter lá suas vantagens, mas eu uso o VirtualBox e sou feliz!]

Esse macetinho eu peguei no próprio site do virtualbox.

Para instalar a versão mais recente do VirtualBox no Ubuntu 8.10 basta inserir a seguinte linha no '/etc/apt/sources.list':


deb http://download.virtualbox.org/virtualbox/debian intrepid non-free


Em seguida:

apt-get update
apt-get install virtualbox-2.1


Só alegria. :-)

bluetooth no XFCE

Sou um fã do xfce e resolvi adotá-lo como padrão no meu laptop, porém me deparei com um problema quando tentei usar bluetooth para trocar arquivos com meu celular. No GNOME funciona tudo que é uma maravilha, mas no meu querido xfce não era bem assim...

Depois de uma googlada achei esta página: http://www.ubuntugeek.com/blueman-bluetooth-manager-for-ubuntu.html. E pronto! Problema resolvido! Instala-se o blueman (bluetooth manager) e o problema está resolvido!

No meu caso, que uso o Ubuntu 8.10, eu inseri a seguinte linha no '/etc/apt/sources.list':


deb http://ppa.launchpad.net/blueman/ppa/ubuntu intrepid main


Em seguida peguei a chave do OpenPGP aqui e segui estas instruções para reconhecer o repositório como um site confiável. [Se você não é tão paranóico com a segurança, pode pular esse passo]

Agora como root faça


apt-get update
apt-get install blueman


Agora é só transferir arquivos usando o blueman. Tem também o blueman-applet pra deixar o blueman ali sossegadinho no "systray".

UM PORÉM: se quiser navegar pelos arquivos do celular (ou outro dispositivo) o blueman por padrão chama o nautilus. Isso pode bagunçar o xfce. Por isso sugiro a utilização do obextool (instalável via apt-get) ou o obexftpfrontend, só que este último é feito em java e é meio pesadinho...

terça-feira, 17 de março de 2009

Dica Orientada a Objetos

Dicas de orientação a objetos.

Na verdade essa é mais uma dica de modelagem com UML.

Quando estamos nos referindo a um campo de uma classe que é um objeto de valor devemos modelá-lo como um atributo no diagrama de classes. Quando o campo é uma objeto de referência, devemos modelá-lo como uma associação.

Exemplos de objetos de valor: data, preço, hora.

Exemplos de objetos de referência: cliente, aluno, empregado.

tags