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.

sexta-feira, 23 de outubro de 2009

Resolvendo o Cubo de Rubik - Passo 3

Devemos virar todo o cubo de maneira que face já montada (face U) se torne a face D. Agora queremos montar a cruz da nova face U (que é a última camada).

Imaginemos que a cor da última camada seja amarela. Inicialmente vamos somente fazer uma cruz amarela, sem se importar se as peças estão no local correto. Temos 3 possibilidades:

  • Se duas peças adjacentes estão com a face amarela para cima. Rotacione o cubo de maneira que as peças fiquem em UF e UR. Em seguida aplique B U L U' L' B'.

  • Se duas peças opostoas estão com a face amarela para cima. Rotacione o cubo de maneira que fiquem em UL e UR. Em seguida aplique B L U L' U' B'.

  • Se nenhuma peça tem a face amarela para cima. Aplique um dos algoritmos acima e em seguida o outro.

  • quinta-feira, 22 de outubro de 2009

    Exigir login e senha para "entrar" no WinXP

    Essa eu pesquei num forum que cheguei a partir de uma googlada, não me lembro agora mas a dica é boa.

    Instalei o windão xp na minha máquina virtual e ele estava entrando direto na conta do administrador, sem pedir senha nem nada.

    Para solucionar basta executar o comando "control userpasswords2", e em seguida marcar a opção "Os usuários devem digitar um nome de usuário e uma senha para usar este computador".

    Só.

    quarta-feira, 21 de outubro de 2009

    Resolvendo o Cubo de Rubik - passo 2

    Agora vem as arestas da camada do meio.

    Deve-se colocar na camada de baixo, a aresta que se quer por na posição correta. Exemplo: o centro azul é vizinho do centro vermelho, então devemos colocar a peça que tem azul/vermelho na camada de baixo e seguir os passos descritos aqui.

    Uma vez que esta peça está na camada de baixo, observamos qual a cor que está na face D. Seguindo o exemplo acima, se for vermelho que está na face D, giramos D de maneira que a peça fique no lado oposto da face que tem o centro vermelho. Ou seja, se o centro vermelho está em F, rotacionamos D até que a peça azul/vermelho fique na posição DB.

    Continuando neste exemplo de cores, colocamos a face de centro vermelho em F e observamos se a face de centro azul está em R ou L.

  • Se estiver em R, aplicamos F D F' D' R' D' R.
  • Se estiver em L, aplicamos F' D' F D L D L'.

    Citando o que está escrito na página onde achei isso: "Uma forma de entender este movimento, se quiser memorizá-lo, é que você está removendo a peça do canto da face U logo acima da aresta que você está tentando repor, e então colocando-a de volta vindo da outra direção, com o efeito colateral de mover a aresta para a posição correta."


    Repetimos isso em todas as cores e TA-DA! A segunda camada já está montada!

    To be continued...

  • sábado, 17 de outubro de 2009

    Resolvendo o Cubo de Rubik - passo 1

    Primeira coisa básica e importante: as peças do meio nunca mudam de posição em relação às demais peças do meio.

    O primeiro passo é montar uma face. Se insistir um pouquinho até que se consegue, mas o segredinho é montar primeiro a "cruz" e depois montar os cantos.

    Deve-se ficar atento para as cores das peças centrais nas faces vizinhas. Ou seja, não adianta montar a face U todinha branca se na face R as peças de cima estão todas misturadas.

    Na página mencionada no post anterior tem os movimentos, mas se você se concentrar em fazer primeiro a cruz e depois os cantos fica relativamente tranquilo.

    To be continued...

    sexta-feira, 16 de outubro de 2009

    Resolvendo o Cubo de Rubik

    Durante a minha infância eu de vez em quando ficava polegando um cubo de rubik (ou cubo mágico) que tinha na minha casa. Nunca resolvi e nunca vi ninguém resolvendo ao vivo. Claro, já vi vídeos impressionantes na internet, mas meros mortais conhecidos resolvendo na minha frente eu nunca vi.

    Em algum momento posterior da minha infância o cubo ficou de lado e nunca mais o vi.

    Eis que no dia das crianças um primo do meu filho dá de presente a ele um cubo de Rubik! Resolvi pesquisar na Internet algum passo-a-passo para solucionar o cubo e encontrei aqui: http://unesp.br/~jroberto/rubiks

    Depois de mais uma vez pensar "como vivíamos sem a Internet e o Google antes?" eu resolvi começar a resolver o cubo. E o que descreverei aqui é somente um resumo bem enxuto escrito de maneira bastante pessoal e intimista. Se você está lendo isso e quer resolver o cubo visite a página mencionada que acredito que será mais proveitoso.

    Notação

  • Face de Cima (Upper) = U
  • Face de Baixo (Down) = D
  • Face Esquerda (Left) = L
  • Face Direita (Right) = R
  • Face Frontal (Front) = F
  • Face Traseira (Back) = B

    Os movimentos de uma face são nos sentidos horários ou anti-horários da face em relação ao centro do cubo. Notação das rotações usando a face U como exemplo:

  • Um giro de 90 graus horário: U.
  • Um giro de 90 graus anti-horário: U' (U linha)
  • Um giro de 180 graus horário ou anti-horário: U2 (U quadrado)

    Também podemos nos referir à localização de peças individuais por combinações de duas letras, para arestas, ou por combinações de três letras para os cantos. Por exemplo, a peça no canto superior, direito, frontal é chamada URF (Upper, Right, Front), e a aresta inferior, esquerda é chamada DL.

    Por enquanto é só. Depois eu coloco como montar a primeira face. Se você está lendo isso e você não sou eu, vá ler direto em http://unesp.br/~jroberto/rubiks que você vai lucrar mais.

  • quinta-feira, 1 de outubro de 2009

    NetBeans com jeito de vim

    Essa dica foi tirada das googladas da vida. Quando comecei a engatinhar no java eu lia o Deitel (Java Como Programar, 6 edição) e ele encorajava a não utilização de um IDE para aprender a linguagem. E eu fiz isso muito feliz da vida, segui usando o meu amado vim.

    Posteriormente, fui experimentar o Eclipse. Fiquei empolgado com todas as facilidades e tudo mais, porém ficava muito irritado de não poder editar um texto (código-fonte) com a mesma agilidade com que faço no vim. Comecei a pesquisar alguma maneira de simular o comportamento do vim no Eclipse e eis que caio numa plugin para NetBeans que faz exatamente isso. Depois disso não fiquei mais em dúvida de qual IDE utilizar.

    Foi batido o martelo quando descobri isso: http://jvi.sourceforge.net/. É um plugin para o NetBeans que deixa o editor com jeitão de vim. Sim!!! Um sonho realizado. Substituição de textos, busca, as teclas já manjadas e todos aquelas facilidades para programar (já comentei isso em outro post)... Não quero outra vida! Se um dia bolarem algo desse tipo no Eclipse eu posso até pensar em experimentá-lo novamente, mas até lá eu sou fã do NetBeans desde criancinha!

    Segue como fazer essa maravilha funcionar:

    1. Vá em http://jvi.sourceforge.net/, procure a parte de download e baixe a versão mais recente do jVi.
    2. Extraia o arquivo zipado em algum canto.
    3. No NetBeans vá em Ferramentas > Plug-ins. Na janelinha que vai abrir vá na aba Baixados, em seguida clique no botão Adicionar plug-ins.
    4. Navegue até o local onde foram descompactados os arquivos, selecione os arquivos com extensão .nbm e clique em Abrir.
    5. Certifique-se de que "jVi KeyBindings" e "jVi Core" estejam marcados e clique em Instalar.
    6. Prossiga com o wizard e seja feliz!

    quinta-feira, 24 de setembro de 2009

    Dicas soltas de NetBeans

    Vi estas dicas lendo alguns tutoriais no próprio site www.netbeans.org.

  • auto-formatação do código: Alt-Shift-F.
  • escrever System.out.println(""); rapidamente: digitar sout e teclar Tab.

    Outros atalhos em Ajuda > Cartão de atalhos de teclado. Quando descobri isso desisti de postar novas dicas aqui. :P~

  • quarta-feira, 23 de setembro de 2009

    engenharia reversa em java

    Para quem tem o .class mas não tem o .java, aí vai um mirror para baixar o Java Decompiler. Muito útil e pequenino! ;-)

    http://www.varaneckas.com/jad

    Depois vai no Jude, importa os .java e, voi-lá!, podemos montar o diagrama de classes.

    terça-feira, 8 de setembro de 2009

    gerando números aleatórios - java

    Em um post anterior (gerando números aleatórios) eu fiz uma função para gerar números aleatórios na linguagem C. Agora aí vai uma versão java fortemente inspirada na maneira que faço no post mencionado.

    O que eu queria fazer era um bobo jogo de dados. No lançamento de um dado ele me retornaria um valor aleatório entre 1 e 6, inclusive. Aí vai a implementação da classe Dado.


    import java.util.Random;

    public class Dado {
            private int valorDaFace;
            private static int seed = 0;

            public int getValorDaFace() {
                    return valorDaFace;
            }

            public void lançar() {
                    Random r = new Random(System.currentTimeMillis() + seed++);

                    valorDaFace = 1 + r.nextInt(6);
            } // fim de lançar()

    } // fim da classe Dado


    O atributo seed é para evitar que quando dois dados sejam lançados um seguido do outro, o resultado seja o mesmo. Em outras palavras, o método System.currentTimeMillis() se chamado muito próximo um do outro, pode retornar o mesmo valor, e isso faria Random gerar o mesmo número. O seed sempre diferente contorna esse problema.

    JUDE no Linux

    Dica que pesquei no google e não me lembro o lugar. Basta dar uma googlada...

    Não tem segredo algum! O jude é feito em java, e portanta basta ter uma máquina virtual java!

    1. ir na página do jude, registrar-se e baixar o jude-community.

    2. descompactar o arquivo .zip em algum lugar (eu coloquei em /usr/local).

    3. para executar o jude basta usar o comando:

    prompt$ java -jar /usr/local/jude_community/jude-community.jar

    4. para facilitar eu criei um scriptzinho besta chamado 'jude' e salvei em /usr/local/bin:

    #!/bin/bash
    JUDE_JAR=/usr/local/jude_community/jude-community.jar
    /usr/bin/java -jar $JUDE_JAR


    5. agora é só criar um atalho com um ícone bonitinho e colocar no seu ambiente gráfico favorito! ;-)

    Não tem jeito... tive que me render a programação orientada a objetos... :/

    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