20 de set. de 2010

Criando um Servidor para Urban Terror

Urban Terror
    Urban Terror é um jogo FPS (First Person Shooter) desenvolvido pela FrozenSand. Com uma jogabilidade bastante realista e gráficos de tirar o fôlego, Urban Terror não deixa nada a desejar em comparação a qualquer jogo em primeira pessoa.



    Configurando arquivo

    Depois do jogo devidamente instalado vamos modificar o arquivo de configuração do Urban Terror.
    Abra um terminal e:
    Entre no diretório onde está nosso arquivo server.cfg (Levando em conta que você tenha instalado em /usr/local/games/).
    $ cd /usr/local/games/urbanterror/q3ut4/
    Edite o arquivo server.cfg.
    $ vim server.cfg
    ou
    $ nano server.cfg
    Caso você seja daquelas pessoas cuidadosas, crie um arquivo de backup antes de editar. ;)
    Esse é o arquivo que descreve como o jogo irá se comportar. Há bastante coisa a se configurar. Vou mostrar neste turorial somente o básico.

    Esse arquivo possui variáveis que são carragadas junto com a aplicação. Vamos ver que valores elas podem assumir e qual o seu comportamento:

    · g_gametype - define o tipo de jogo. Pode assumir os valores:
       0=FreeForAll
    3=TeamDeathMatch
    4=Team Survivor
    5=Follow the Leader
    6=Capture and Hold
    7=Capture The Flag
    8=Bombmode
    · timelimit - tempo em minutos para o fim do mapa. [0 é o mesmo que nunca.]
    · fraglimit - número máximo de pontos para o fim do mapa. [0 é o mesmo que nunca.]
    · capturelimit - número máximo de bandeiras a serem capturadas. [0 é o mesmo que nunca.]
      serve somente para o modo CTF (Capture the Flag=7)
    · g_mapcycle - nome do arquivo onde estão configurados os mapas a serem utilizados no decorrer do jogo.
    · map - por qual mapa começar.
    Um material mais avançado sobre o arquivo pode ser encontrado em http://www.urbanterror.info


    Ciclo de Mapas

    Editando o arquivo mapcycle.txt é possível definir um ciclo de mapas para seu servidor.
    Apenas lembre-se que ao jogar com os bots, somente alguns mapas são compatíveis. Veja: [http://mad3linux.blogspot.com/2009/11/urban-terror.html]


    Criando um bash para rodar o servidor
      Agora basta criar um arquivo em shell script para rodar nosso servidor. Basta criar um arquivo de texto no local de instalação do seu Urban Terror. (Seguindo o tutorial em /usr/local/games/urbanterror)

      Copie as seguintes linhas:

      #!/bin/bash
      while true
        do
         /usr/local/games/urbanterror/ioUrTded.i386 +set fs_game q3ut4 +set dedicated 2 +set net_port 27960 +set com_hunkmegs 128 +exec server.cfg
         echo "server crashed on `date`" > last_crash.txt
      done
      Nomeio como start.sh
      Vamos a uma pequena explanação do que o arquivo fará.
      Como todo bom servidor, ele deverá rodar "sempre". Por isso temos um laço iterando nossa linha de comando.
      Logo abaixo do laço, temos o comando que faz nosso servidor se comportar da maneira que configuramos antes no arquivo server.cfg.
      Vamos quebrá-lo em partes.
      Primeiro vem a chamada para o executável dedicado do Urban Terror. O chamado ioUrTded.i386, o qual roda uma isntância do jogo em modo texto.
      Depois temos algumas variáveis. Note o "+set" que indica que setaremos algumas variáveis.
      · fs_game - indica o diretório onde procurar arquivos de configuração. Valor: q3ut4, que é o diretório onde
      ficam os arquivos de configuração.
      · net_port - configura a porta utilizada pelos clientes. Sempre escolha uma porta maior que 1024, pois entre 1 e 1024 são portas reservadas.
      Por último vem o "+exec" o qual executa todas as configurações feitas em server.cfg.
      Pronto. Agora basta rodar seu script recem criado. No terminal:
      $ chmod a+x start.sh
      $ sh start.sh

      Clientes do Jogo

      Para os clientes acessarem o servidor basta que eles abram o jogo e cliquem em play online. Logo em baixo aparece a opção Source, com os itens Internet, Favorites e Local. Escolha local e depois clique em Refresh List. Caso ainda não apareça verifique a opção Type abaixo de Source. All significa todos os tipos, depois segue a lista Free For All (Todo mundo contra), Team Deathmatch (Partida com times), Team Survivor (Último Sobrevivente do Time), Follow The Leader (Seguir O Líder), Capture And Hold (Capturar e Defender), Capture The Flag (Capturar A Bandeira), Bomb Mode (Modo Bomba). Depois disso basta clicar em Connect e pronto.

      Servidor em Modo Gráfico

      Também é possível criar um Servidor para Urban Terror em modo gráfico. Abra o jogo e clique em start server. Logo após é possível definir como será o jogo. Tem as opções de setup, tipo do jogo, opções do servidor e selecionar o mapa. Dessa forma parece mais fácil, contudo fica chato ter que configurar o server toda vez que for jogar.

      Screenshots

        Recarregar (R)


        Curar (Q)


        15 de set. de 2010

        Botões do Ubuntu 10.04 no lado Direito

        Pra quem usa Ubuntu ou qualquer outra distribuição GNU/Linux, já está acostumado a minimizar e fechar uma janela (não gosto desse nome) no seu lado direito, só quem a versão 10.04 Lucid Lynx resolveu inovar e colocar esses tão usados botões no lado esquerdo.

        Pra quem não gostou, ai vai a solução.

        Será usado o editor Gconf para alterar o layout do botão.

        Tecle Alt+F2, digite gconf-editor e vá em apps/metacity/general. Dê um clique duplo em button_layout para abrí-lo em seguida digite: menu:maximize,minimize,close

        Pronto resolvido.

        10 de set. de 2010

        Como mudar o home de um usuário?

        usermod -d /novo/home/do/seu/usuario nome_usuario

        Por que mudar home de um usuário?
        Bom, tive a necessidade quando fui instalar o PostgreSQL no slackware. Ao tentar a primeira vez pelo modo gráfico, ocorreu um erro, mas o usuário, o grupo e o diretório home do postgres já estavam criados. Por isso tive a necessidade de querer mudar o home do usuário. Para isso basta:

        Ex.:

        # usermod -d /var/lib/pgsql postgres


        Atente para o fato do usuário não estar logado quando a mudança ocorrer.

        Mais opções:

        -a, --append juntar o utilizador aos GRUPOS suplementares
        (usar apenas com -G)
        -c, --comment COMENTÁRIO novo valor do campo GECOS
        -d, --home HOME_DIR novo directório para a conta do utilizador
        -e, --expiredate DATA_EXPIRAR define a data em que a conta expira
        para DATA_EXPIRAR
        -f, --inactive INACTIVA define a password como inactiva após expirar em
        INACTIVA
        -g, --gid GRUPO forçar a utilização do GRUPO como novo grupo pri mário
        -G, --groups GRUPOS nova lista de grupos adicionais
        -h, --help mostrar esta mensagem de ajuda e sair
        -l, --login NEW_LOGIN novo valor para o nome de login
        -L, --lock bloquear a conta do utilizador
        -m, --move-home mover o conteúdo do directório home para o novo
        local (usar apenas com -d)
        -o, --non-unique permite utilizador UIDs duplicados (não únicos)
        -p, --password PASSWORD utilizar password encriptada para a nova nova
        password
        -s, --shell SHELL nova shell de login para a conta do utilizador
        -u, --uid UID novo UID para a conta do utilizador
        -U, --unlock desbloquear a conta do utilizador

        24 de ago. de 2010

        Instalando o Flash Player 10 no Ubuntu 8.04 em multiterminal com o MDM

        Entre no terminal (consola) e execute os seguintes comando no bash:

        $ su
        [digite a senha]
        # echo "deb http://archive.canonical.com/ubuntu/ hardy partner" >> /etc/apt/sources.list
        # echo "deb-src http://archive.canonical.com/ubuntu/ hardy partner" >> /etc/apt/sources.list
        # apt-get update && apt-get install adobe-flashplugin

        1 de mai. de 2010

        Lighttpd e codificação padrão

        Passei um tempo tentando configurar Lighttpd + eRuby no Ubuntu e dava problema com a codificação.

        Tentei setar no lighttpd.conf um mimetype, mas não dava certo. Então, googlando, achei essa solução.

        Você precisa especificar a codificação para o eRuby, de forma que ele já repasse para o Lighttpd codificado corretamente.


        28 de abr. de 2010

        Boas práticas de programação 3 - Java Collections Framework

        Collections - Classe Java para Manipular Listas.

        Se você estava a procura de uma forma rápida de ordenar listas, embaralhá-las, entre outras coisas, esta é a classe.
        Ela pode manipular várias Interfaces do java, como:
        • Set
        • List
        • Map
        • SortedSet
        • entre outras.

        A classe Collections oferece vários métodos que são de bastante utilidade. Confira:

        • sort(List) - ordena uma lista usando o algoritmo merge sort, o qual provê uma performance média comparado com o algoritmo quicksort, mas garantindo performance de [n*log n] (diferente do quicksort), e estabilidade (diferente do quicksort).

        obs.: Você deve implementar a Inteface Comparable. Mas como eu faço isso? Simples. Veja ai!

        Vamos supor que você tenha uma classe Produto com essa cara:

        public class Produto {

        private Integer id;
        private String descricao;
        private Double preco;
        private Long codigoBarra;

        // getters and setters ...
        }


        Para que o Collections.sort(List) ordene o Produto pela descricao, por exemplo, primeiro implemete a Interface Comparable.
        E implemente o método compareTo(Object).

        public class Produto implements Comparable {

        // continua o mesmo acima ...
        @Override
        public int compareTo(String value) {
        return this.descricao.compareTo(value);
        }
        }


        Mas por que isso deve ser feito? Bom, primeiro pois o sort ordena seus elementos a partir do resultado que retorna o compareTo(Object). Esse método tem por função retornar números inteiros negativos(não necessariamente -1), positivos (não necessariamente 1) ou zero.
        Dica: se você tiver uma List de String, por exemplo, não é necessário implementar o compareTo, pois esse trabalho já foi feito pelos desenvolvedores da Sun. Isso vale para as várias classes conhecidas como Integer, Long, Double, etc.

        Bom, o próximo passo é chamar o método:

        public class ProdutoDao {

        // atributos e construtor ...

        public List findAll() {

        List list = new ArrayList();
        // conexão com o banco e a query ...
        while (rs.next()) {
        // Pegue os dados do ResultSet e adicione na lista
        list.add(produto);
        }
        Collections.sort(list);
        return list;
        }
        }


        • reverse(List) - Reverte a ordem dos elementos na lista.

        Vamos supor a seguinte situação: Você quer os elementos de uma lista ordenados de forma decrescente. Bem, agora
        que você já aprendeu a ordenar de forma crescente, basta chamar o sort(List) e depois o reverse(List).

        public List findAll() {

        List list = new ArrayList();
        // conexão com o banco e a query ...
        while (rs.next()) {
        Produto produto = new Produto();
        // Pegue os dados do ResultSet e adicione na lista
        list.add(produto);
        }
        Collections.sort(list);
        Collections.reverse(list);
        return list;
        }


        • swap(List, int, int) - Troca elementos da List a partir do índice.

        Útil quando necessário algum tipo de prioridade de certo elemento, basta achá-lo e trocar de lugar com outro
        usando o método swap.

        // ...
        Collections.swap(list, 3, 1);
        // ...


        No caso o elemento 3 da list foi para a primeira posição e o 1 foi para a terceira posição.

        • shuffle(List) - permuta randomicamente uma lista usando um código randômico padrão.

        É ideal quando você precisa embaralhar, por exemplo, uma lista de cartas de uma baralho.

        // ...
        Collections.shuffle(list);
        // ...


        Para mais informações sobre Java Collections Framework visite: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html

        26 de mar. de 2010

        Ranking Global de Internet

        Dados do relatório Global Information Technology Report 2009-2010 (Relatório Global de Tecnologias da Informação).

        Avalia o nível de preparo dos países para usar as tecnologias de comunicação e informação em três áreas no ambiente regulatório, empresarial e de infraestrutura destas tecnologias. No preparo dos três principais grupos (indivíduos, empresas e governos) para o uso e aproveitamento destas tecnologias; e na implementação real das últimas tecnologias de comunicação e informação disponíveis.



        Então vamos lá galera, vou listar os 10 primeiros paises da lista.












        1 – Suécia

        2 – Cingapura

        3 – Dinamarca

        4 – Suíça

        5 – Estados Unidos

        6 – Finlândia

        7 – Noruega e Canadá

        8 – Hong Kong

        9 – Holanda



        O estudo foi feito com 133 países.

        Há é mesmo já ia me esquecendo do Brasil ele ficou em 61º, na minha opnião posição ruim pelo que o Brasil representa no em relação à tecnologia. Mas acontece, um dia espero ver o Brasil na lista dos 20 primeiros.

        Referência: http://olhardigital.uol.com.br/digital_news

        11 de fev. de 2010

        DADP - Desenvolvimento de aplicativos desktop em Java utilizando padrões

        Estão abertas as inscrições para a terceira turma do curso a distância DADP - Desenvolvimento de aplicativos desktop em Java utilizando padrões.
        Ministrada pelo Prof. Antonio Passos.
        Trata-se de curso livre e de qualificação, online e gratuito, voltado para estudantes e profissionais de TI. Entre seus objetivos está a capacitação dos participantes para:

        * Projetar aplicativos desktop estruturados em camadas;
        * Aplicar padrões de projeto no desenho de aplicativos desktop;
        * Construir aplicativos desktop usando a linguagem Java, a IDE NetBeans e bancos de dados relacionais.

        Para mais informações acessem o link abaixo:
        https://docs.google.com/Doc?docid=0Aef7Mov4Vj1OZGhjN3FkNGZfMGd4NzJwa2Ny&hl=en&pli=1

        10 de fev. de 2010

        Como resolver o problema de gravação Audacity no Ubuntu



        Se você não conseguir selecionar "Wave Out" ou "Stereo Mix" que está listado como fonte de entrada na barra de ferramentas do mixer do Audacity, você ainda pode gravar com o Audacity. Você só precisa instalar o PulseAudio Volume Control.

        Como resolver o problema de gravação Audacity no Ubuntu
        Nota: Funciona desde a versão 9.10 Karmic Koala, testado em todos até o 11.10 Oneiric Ocelot
        1. Instale PulseAudio Volume Control, executando o seguinte no terminal:

        2. $ sudo apt-get install pavucontrol


        3. Execute o Audacity e

        4. a) vá para Preferências, pressionando Ctrl + P (ou selecione "Editar" -> "Preferências ..." do menu drop-down).
          b) clique no botão "Devices".
          c) alterar o dispositivo de reprodução para "Pulse".
          d) alterar o dispositivo de gravação de "Pulse".

        5. Abra o PulseAudio Volume Control ( "Aplicações" -> "Som e Vídeo" -> "PulseAudio Volume Control") e deixe-o aberto.
          Na primeira vez que você usa um programa de gravação, você precisa editar as configurações de gravação do PulseAudio Volume Control. Deve-se lembrar as suas configurações após a reinicialização.

        6. Abra o Audacity e clique em "Gravar".

        7. Enquanto está gravando no Audacity, abra PulseAudio Volume Control e selecione a aba "Gravar". Ela vai mostrar "Alsa plug-in Audacity. Alsa capture from" e um combo-box. Escolha o "Monitor of internal audio..." se você usar uma placa de som onboard.

          Nota: Você precisa selecionar um outro monitor se você quiser usar qualquer outro dispositivo de reprodução de uma placa de som onboard. Por exemplo, quando eu reproduzir o som com fones de ouvido Microsoft LifeChat ligado ao meu computador via USB, eu seleciono o "Monitor da Microsoft LifeChat Analógica estéreo para capturar com o Alsa.


        8. Verifique o Audacity, que deve está gravando agora!

        8 de fev. de 2010

        Boas Práticas de Programação 2 - A Soma De Gauss

        A Lenda

        Conta-se que um professor de Matemática pediu aos alunos de sua turma que somassem todos os números de 1 a 100, como forma de castigo por serem indisciplinados. Grande foi a surpresa desse professor quando, em pouquíssimo tempo, uma das crianças (Carl Friedrich Gauss) levantou-se e lhe entregou uma folha de papel com o resultado correto e uma ideia simples, porém genial.

        Trata-se da seguinte lógica:

        S = (1+100) + (2+99) + (3+98) + ... + (50+51);


        Para cada parcela temos o valor 101. E ao total temos 50 parcelas.
        Logo, S = (50 * 101) → S = 5050.

        Outra maneira de tratarmos desse problema seria,

        S = n(n+1)/2;


        Computacionalmente falando...

        Levando esse problema para uma linguagem de programação, como Java, teriamos os seguintes trechos de código:

        1. Iterando com um laço.


        2. Utilizando a soma de Gauss


        É notável que o consumo de processamento nos dois casos é muito significativo. Enquanto no exemplo 1 foram
        realizadas 100 iterações, o exemplo 2 possui apenas uma instrução.

        Friedrich Gauss (1777 - 1855)
        Foi um astrônomo, matemática, e físico alemão.

        Boas Práticas de Programação 1

        Linguagem Java

        1. Ao comparar Objetos, prefira começar pelo que você tem certeza que não seja nulo. Por exemplo:




        Dessa maneira você evitará o erro:
        Exception in thread "main" java.lang.NullPointerException
        at mad3linux.Main.main(Main.java:20)
        Java Result: 1

        2. Ao criar um Bean para uso com banco de dados, crie os atributos que podem receber nulo em seu valor não com os tipos primitivos com int, long, boolean, double, etc. Crie como classes. Por exemplo:



        Dessa maneira o atributo telefone, por exemplo poderá receber valores nulos, e não vai ser preciso validar, por exemplo, buscas e verificar se tal valor for nulo e por um zero no lugar. Exemplo:

        Se o atributo telefone tiver o valor nulo, não terá problema pois o telefone é da Classe Long, e não do primitivo long, o qual não poderia ser nulo.

        Think About it!

        14 de jan. de 2010

        Wallpaper Ubuntu by Nightcrawler

        Galera, esse wallpaper foi feito com Gimp e um tutorial muito bem feito tirado do site http://www.gimpusers.com. Apesar de ser em inglês, é bem intuitivo pois possui fotos exemplificando cada passo.