andLinux – usando Linux dentro do Windows

Que tal rodar aplicativos do Linux dentro do Windows? Uma das formas é usando uma virtualbox.
Outra, é usando o andLinux. Com ele, você pode dentro do seu Windows (versões 2000, XP, 2003 e Vista) rodar o Ubuntu Gutsy (versão 7.10) com o XFCE (há ainda uma versão mais completa com o KDE disponível).
A partir dele, dá para atualizar a versão do Ubuntu para a Hardy (8.04, mais atual) e instalar qualquer aplicativo do Linux (inculsive, usando o Synaptic).

Qual a vantagem de se usar o andLinux? Perfomance é a maior. Ele é diferente de uma virtualbox, onde você está basicamente rodando um outro sistema operacional dentro do seu principal. Nesse caso, você está rodando um merge entre dois SOs, com isso o consumo de memória e processamente é muito menor.
Ah, e também não tem problema de drivers. Ok, as versões novas das distros do linux apresentam muitos poucos problemas nesse quesito, mas nesse caso aqui os drivers do Windows são os utilizados 😉

Ainda não me utilizei do andLinux, mas me parece ser interessante: você parte de uma instalação simples do Linux, sem nada, e vai adicionando tudo aqui que precisar, sem carregar demais o seu sistema, e tudo integrado ao Windows. Ganho de produtividade 🙂

Links interessantes:

Como matar o dragão e salvar a princesa – pelos programador

Certa vem um dragão aprisionou um alinda princesa em uma torre em uma ilha, a única forma de se acessar esta ilha era atravez de uma ponte na qual o dragão ficava dia e noite de vigia, então lá vão nossos "heróis" da informática salvar a princesa, cada uma sua maneira:

Programador Java
Chega, encontra o dragão. Desenvolve um framework para aniquilamento de dragões em múltiplas camadas. Escreve vários artigos sobre o framework, mas não mata o dragão.

Programador .NET
Chega, olha a ideia do Javanês e a copia, tenta matar o dragão, mas é comido pelo réptil.

Programador C
Chega, olha para o dragão com olhar de desprezo, puxa seu canivete, minúsculo extremamente leve e simples degola o dragão. Encontra a princesa, mas a ignora para ver os últimos checkins no cvs do kernel do linux.

Programador C++
Cria um canivete básico e vai juntando funcionalidades até ter uma espada complexa avassaladora, mas que apenas ele consegue entender … Mata o dragão, mas trava no meio da ponte por causa dos memory leaks.

Programador COBOL
Chega,olha o dragão, pensa que tá velho demais para conseguir matar um bicho daquele tamanho e pegar a princesa e, então, vai embora de volta ao seu mundinho.

Programador Pascal
Se prepara durante 10 anos para criar um sistema de aniquilamento de dragão… Chegando lá descobre que o programa só aceita lagartixas no máximo médias como entrada.

Programador VB
Monta uma arma de destruição de dragões a partir de vários componentes, parte pro pau pra cima do dragão e, na hora H, descobre que a espada só funciona durante noites chuvosas, e deve ser reiniciada a cada golpe para voltar a funcionar, só não sabe o pq disso…

Programador PL/SQL
Coleta dados de outros matadores de dragão, cria tabelas com N relacionamentos de complexidade ternaria, dados em 3 dimensões, OLAP, demora 15 anos para processar a informação. Enquanto isso a princesa virou lésbica.

Programador Ruby
Chega com uma p*t* fama, falando que é o melhor faz tudo, quando vai enfrentar o dragão ao invés de ir pros finalmente, mostra um videozinho dele matando um dragao … O dragão come ele de tédio.

Programador Smalltalk
chega, analisa o dragão e a princesa, vira as costas e vai embora, pois eles são muito inferiores.

Programador shell
cria uma arma poderosa para matar os dragões, mas, na hora H, não se lembra como usá-la.

Programador shell(2)
o cara chega no dragão com um script de 2 linhas que mata, corta, estripa, empala, pica em pedacinhos e empalha o bicho, mas na hora que ele roda, o script aumenta, engorda, enfurece e coloca álcool no fogo do dragão.

Programador ASSEMBLY
acha que está fazendo o mais certo e enxuto, porém troca um A por D, mata a princesa e transa com o dragão.

Programador Fortran
Chega desenvolve uma solução com 45000 linhas de codigo, mata o dragão vai ao encontro da princesa … mas esta o chama de tiuzinho e sai correndo atrás do programador java que era elegante e ficou rico.

Programador FOX PRO
Desenvolve um sistema para matar o dragão, por fora é bunitinho e funciona, mas por dentro está tudo remendado. Quando ele vai executar o aniquilador de dragões descobre que esqueceu de indexar os DBF´s.

Programador CLIPPER
Monta uma rotina que carrega um array de codeblocks para insultar o dragão, cantar a princesa, carregar a espada para memória, moer o dragão, limpar a sujeira, lascar leite condensado com morangos na princesa gostosa, transar com a princesa, tomar banho, ligar o carro, colocar gasolina e voltar pra casa. Na hora de rodar recebe um "Bound Error: Array Access" e o dragão come ele com farinha.

 

*texto retirado dessa comunidade do Orkut

Coincidências entre garotas e garotos programadores

1 – Você trabalha em horários estranhos.

2 – Te pagam para fazer o cliente feliz.

3 – Seu trabalho vai sempre além do expediente.

4 – Você é mais produtivo à noite.

5 – Você é recompensado por realizar as idéias mais absurdas do cliente.

6 – Seus amigos se distanciam de você e você só anda com outros iguais a você.

7 – Quando você vai ao encontro do cliente você precisa estar apresentável, mas quando você volta parece que saiu do inferno.

8 – O cliente sempre quer pagar menos e quer que você faça maravilhas.

9 – Quando te perguntam em que você trabalha você tem dificuldade para explicar.

10 – Se as coisas dão errado é sempre culpa sua.

11 – Todo dia você acorda e diz: NÃO VOU PASSAR O RESTO DOS MEUS DIAS FAZENDO ISSO.

Primeiros Jogos Olímpicos na web 2.0 e na China – paradoxo

E semana passada começaram os Jogos Olímpicos de Pequim. Ou melhor, os Jogos da Vigésima Nona Olimpíada.
A primeira Olimpíada nessa era pós-boom da web 2.0. Não é a primeira na época da Internet (acho que desde 1996 já tínhamos a web, e ela sendo usada como meio de disseminação das notícias relacionadas). Mas, certamente, essa é a primeira vez em que o conteúdo não é mais gerado – apenas – pela mídia especializada, pelo jornalismo convencional.
Estamos na era do jornalismo colaborativo, do microblogging, da distribuição de vídeos e fotos em real time através do uso de celulares de última geração, e tudo mais que a web 2.0 proporciona.

Por exemplo, você pode ver pela web a transimssão dos jogos pelo JustIn, ou acompanhar os posts que a tag #olympicgames pelo Twitter com as últimas informações, procurar no Youtube pelos últimos vídeos postados pelos usuários (com aquela imagem EMOcionante feita das arqubancadas) ou ainda ir no Google e fazer uma procura usando o nome do esporte junto com olimpíadas para ver os resultados mais atuais; por exemplo, para saber sobre futebol procure por "futebol olimpíadas". Ou ainda quem usa redes sociais (Facebook, Orkut, Netvibes, etc…) pode adicionar gadgets feitos exclusivamente para que você tenha as últimas notícias sobre os Jogos.

As possibilidades são inúmeras; conteúdo colaborativo está aí, é o futuro.
E chega atá a ser engraçado – talvez uma piada poética – que esses Jogos, os primeiros nessa nova era, estão ocorrendo num país onde a Internet sofre censura. Aliás, não só a Internet, como qualquer forma de manifestação popular: desde protestos até o simples ato de informar algo boca-a-boca. Mas, a vida é de paradoxos, e a partir da quebra deles é que grandes mudanças ocorrem 🙂

Aliás, esse post é, basicamente, motivado por não estarmos mais presos às transmissões da Globo com o Galvão ou da Band com o Luciano do Valle; podemos escolher de onde pegar as informações 🙂

Usando a Prototype – passo 1 – escondendo selects debaixo de uma popup

Vamos lá, falar de usos práticos da biblioteca Prototype. Okey, aqui no And After há alguns posts a respeito já, mas estou pensando em criar uma série deles.
Nesse primeiro, amos ver como criar uma função que esconde determinados elementos do html se outro estiver por cima.

Não entendeu? Vamos lá, vou explicar de onde veio a idéia – acho que fica mais fácil.
Uma coisa que aparece em qualquer projeto de web ultimamente é a necessidade de se fazer caixas (normalmente divs) que abrem por cima de outras. Normalmente para mostrar conteúdos oriundos de requisições ajax (ok, sei que o termo não está correto, mas não consegui pensar em outro).
Aí, o que normalmente se faz? Tem-se uma div com display:none e no retorno da requisição (callback), dá-se um display:block nela mostrando o conteúdo da forma adequada.
O grande problema é quando essa div abre por cima de um select ou um flash, por exemplo. O IE6 mostra o select ou o swf por cima da div (não ocorre no Firefox nem IE7), acabando com o layout e dificultando tudo. Para isso fiz essa função aqui, genérica, que recebe dois parâmetros: o id do seu elemento html que estará por cima, e o id de um elemento html que contém elementos do tipo select.

Usando o objeto Position (veja a documentação aqui) da Prototype, é possível acessar o método cumulativeOffset(element) que retorna um array com as posições das coordenadas x e y do elemento, independente do local no código em que esteja (posição relativa dos pais, absoluta, floats, etc…)
Com isso, o que é feito: pega-se a posição da div de popup e suas dimensões, e se varre a lista de selects presentes no outro elemento. A cada select que é encontrado, pega-se também as coordenadas desse select e suas dimensões, e através de uma lógica simples faz a comparação nos eixos x e y se a popup está por cima do select. Se sim, deixa o select como invisível.
Segue o código:

function escondeNoOver(id_popup, id_area) {
        //define qual a popup
        var popup = $(id_popup);
        //pega todas os selects de um determinado elemento
        var selects = $(id_area).getElementsByTagName("select");
        //pega coordenadas X/Y da popup (topo do lado esquerdo) e dimensões da mesma
        var posX = Position.cumulativeOffset(popup)[0];
        var posY = Position.cumulativeOffset(popup)[1];
        var width = popup.clientWidth;
        var height = popup.clientHeight;
       
        //percorre a lista de selects
        for(i=0; i<selects.length; i++) {
           
            //pega coordenadas X/Y do select (topo do lado esquerdo) e dimensões do mesmo
            var selX = Position.cumulativeOffset(selects[i])[0];
            var selY = Position.cumulativeOffset(selects[i])[1];
            var widthS = selects[i].clientWidth;
            var heightS = selects[i].clientHeight;
           
            var onX = false;
            //verifica se no eixo X (horizontal), a popup está entre o início e o final do select
            if(posX<selX+widthS) {
                if(posX+width>selX)
                    onX = true;
            } else {
                if(selX+widthS>posX+width)
                    onX = true;
            }
           
           
            //verifica se no eixo Y (vertical), a popup está entre o início e o final do select
            var onY = false;
            if(posY<selY+heightS) {
           
                if(posY+height>selY)
                    onY = true;
            } else {
                if(selY+heightS>posY+height)
                    onY = true;
            }
           
            //tem que estar dentro de X e Y para esconder a popup
            if(onX && onY){
                selects[i].style.visibility = "hidden";
            }
        }
    }

Abaixo segue o código funcional de um html com essa função, onde ao clicar no link do final da página sera chamada a função e ela verificará se há campos do tipo select por baixo daquela div de popup que possui um fundo acinzentado.
Vale notar que essa função pode ser alterada para verificar outros tipos de objetos e não precisa ser usada apenas para essa questão de retorno de requisições ajax – muitas vezes precisamos esconder algumas coisas, independente do motivo, não? 🙂
 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
* {margin:0; padding:0; border:0;}
body {font-family:Verdana, Arial, Helvetica, sans-serif;}
input, select, textarea {border:1px solid #000000;}
form {margin:50px;}
p {margin:10px;}
div#popup{padding:20px; border:3px solid #000000; position:absolute; left:80px; top:350px; background-color:#F0F0F0; width:200px;}
</style>
<script type="text/javascript" src="http://www.prototypejs.org/assets/2008/1/25/prototype-1.6.0.2.js"></script>
<script type="text/javascript">
    function escondeNoOver(id_popup, id_area) {
        //define qual a popup
        var popup = $(id_popup);
        //pega todas os selects de um determinado elemento
        var selects = $(id_area).getElementsByTagName("select");
        //pega coordenadas X/Y da popup (topo do lado esquerdo) e dimensões da mesma
        var posX = Position.cumulativeOffset(popup)[0];
        var posY = Position.cumulativeOffset(popup)[1];
        var width = popup.clientWidth;
        var height = popup.clientHeight;
        //percorre a lista de selects
        for(i=0; i<selects.length; i++) {
            //pega coordenadas X/Y do select (topo do lado esquerdo) e dimensões do mesmo
            var selX = Position.cumulativeOffset(selects[i])[0];
            var selY = Position.cumulativeOffset(selects[i])[1];
            var widthS = selects[i].clientWidth;
            var heightS = selects[i].clientHeight;
            var onX = false;
            //verifica se no eixo X (horizontal), a popup está entre o início e o final do select
            if(posX<selX+widthS) {
                if(posX+width>selX)
                    onX = true;
            } else {
                if(selX+widthS>posX+width)
                    onX = true;
            }
            //verifica se no eixo Y (vertical), a popup está entre o início e o final do select
            var onY = false;
            if(posY<selY+heightS) {
           
                if(posY+height>selY)
                    onY = true;
            } else {
                if(selY+heightS>posY+height)
                    onY = true;
            }
            //tem que estar dentro de X e Y para esconder a popup
            if(onX && onY){
                selects[i].style.visibility = "hidden";
            }
        }
    }
</script>
</head>
<body>
<div id="popup">sua div de popup</div>
<form action="entreemcontato.php" method="post" id="form">
<div>
    <p>Nome:</p>
    <p><input type="text" name="nome" value="Seu Nome"/></p>
    <p>Comentários:</p>
    <p><textarea name="comentários" rows="5" cols="20">
    Seus comentários
    </textarea></p>
    <p>Você é:</p>
    <p><input type="radio" name="vocee" value="homem" checked="checked"/>
    Homem
    </p>
    <p><input type="radio" name="vocee" value="mulher"/>
    Mulher
    </p>
    <p><input type="checkbox" name="cefet" checked="checked"/>Estudo no Cefet</p>
    <p>O que você achou desse minicurso?</p>
    <select>
    <option value="bom">Bom</option>
    <option value="regular" selected="selected">Regular</option>
    <option value="ruim">Ruim</option>
    </select>
    <p>Você repetiria esse curso?</p>
    <select>
    <option value="bom">Sim</option>
    <option value="regular" selected="selected">Sempre</option>
    </select>
    <p><input type="submit" value="Enviar"/></p>
    <p><input type="reset" value="Limpar"/></p>
</div>
</form>
<a href="#" onclick="escondeNoOver(´popup´, ´form´);" title="checar popup">checar popup</a>
</body>
</html>
 

Em breve, outros exemplos usando a Prototype 🙂