Return 0

Abril 29, 2008

Lançado Nano-transistor 50 vezes mais rápido que os atuais

Arquivado em: Diversos — Tags: — computeiro @ 9:23 pm

Em 1965, Gordon Moore profetizou que o poder de processamento dos computadores dobraria a cada dois anos, impulsionado pela redução no tamanho dos transístores e no conseqüente aumento na freqüência de clock. Naturalmente, não se trata de vidência ou de nenhuma lei mística que misteriosamente se aplica aos transístores, mas sim de um simples modelo econômico sobre o qual a indústria de eletrônicos tem se baseado.

O futuro da lei de Moore ao que tudo indica reside no grafeno (graphene) um material abundante, que pode ser encontrado no grafite e em outros compostos de carbono. O grafeno é uma estrutura surpreendentemente estável e resistente.

Tendo em pauta a promessa do grafeno sendo um dos principais materiais ara fabricação de transístores no futuro, o site Inovação Tecnológica publicou uma interessante notícia sobre um grupo de cientistas da Suécia, que anunciaram a fabricação de um surpreendente nano-transístor que não é feito com materiais de fronteira, e sim com o arseneto de índio (InAs), liga semicondutora largamente utilizada na indústria. O nano-transístor tem cerca de 10 nanômetros, similar ao tamanho do de grafeno mostrado na notícia acima.

“Hoje os transistores são fabricados em um processo “de cima para baixo”, escavando-se o silício por um processo chamado fotolitografia. A equipe do Dr. Lars-Erik Wernersson, da Universidade de Lund, partiu do enfoque oposto, construindo o seu transístor de baixo para cima, ou seja, fazendo-o crescer naturalmente como um cristal. Os cientistas já sabem que não conseguirão avançar a miniaturização além de determinadas dimensões com as tecnologia atual, baseada no silício.”

Guia do Hardware

return 0

Abril 28, 2008

Print [0]

Arquivado em: Apple — Tags:, , — computeiro @ 1:59 am

No nosso primeiro print (lembram-se deles?) depois da perda do acervo, frases do irreverente… :

“Você quer ficar o resto da sua vida vendendo água com açúcar ou você quer uma chance de mudar o mundo?”
“Os botões do Max OS são tão bem-feitos que você vai querer lambê-los.”
“Se criar bons produtos fosse tão fácil quanto assinar um cheque, a Microsoft teria grandes produtos.”

(Steve Jobs)

return 0

Abril 26, 2008

Write in C

Arquivado em: C/C++, Diversos — Tags:, , — computeiro @ 2:14 am

Tudo bem, vão falar que eu sou programador C, de tanto post que eu tenho sobre C. É que: 1. Não tô muito inspirado esses tempos; 2. C merece!

Quem não conhece este clássico da música clássica programística, que atire a primeira pedra.

WRITE IN C

When I find my code in tons of trouble,
Friends and colleagues come to me,
Speaking words of wisdom:
Write in C.”
As the deadline fast approaches,
And bugs are all that I can see,
Somewhere, someone whispers”
Write in C.”
Write in C, write in C,
Write in C, write in C.
LISP is dead and buried,
Write in C.
I used to write a lot of FORTRAN,
for science it worked flawlessly.
Try using it for graphics!
Write in C.
If you’ve just spent nearly 30 hours
Debugging some assembly,
Soon you will be glad to
Write in C.
Write in C, write in C,
Write In C, yeah, write in C.
Only wimps use BASIC.
Write in C.
Write in C, write in C,
Write in C, oh, write in C.
Pascal won’t quite cut it.
Write in C.
Guitar Solo
Write in C, write in C,
Write in C, yeah, write in C.
Don’t even mention COBOL.
Write in C.
And when the screen is fuzzy,
And the edior is bugging me.
I’m sick of ones and zeroes.
Write in C.
A thousand people people swear that T.P.
Seven is the one for me.
I hate the word PROCEDURE,
Write in C.
Write in C, write in C,
Write in C, yeah, write in C.
PL1 is 80’s,
Write in C.
Write in C, write in C,
Write in C, yeah, write in C.
The government loves ADA,
Write in C.

A letra tem alguns trechos errados, mas com esse cara cantando afinadamente desse jeito é bem difícil de entender. Se puderem me ajudar a consertar a letra, comentem.

return 0

Abril 24, 2008

Script Suicida

Arquivado em: Shell Script, gnu/linux — Tags:, , , , , — computeiro @ 11:58 pm

Se você usa GNU/Linux, fiz o script mais legal e sem utilidade do mundo: eis o Script Suicida! Escreva isto num editor qualquer (só isto) e salve como script.sh:

#! /bin/sh

rm script.sh

Não se esqueça de teclar:

$ chmod +x script.sh

E depois executar:

$ ./script.sh

Voilá! Ele se mata.

return 1

Abril 23, 2008

Obfuscated C

Arquivado em: C/C++ — Tags:, , — computeiro @ 11:57 pm

A Competição Internacional de Código Ofuscado em C (International Obfuscated C Code Contest, ou IOCCC) é uma comptetição anual que ocorre desde 1984. O vencedor é aquele que produzir o código em C mais criativo, bizarro e difícil de ler, mas que rode. Os programas vencedores geralmente são engraçados, magníficas obras de arte, na maioria das vezes, ótimos exemplos de como não programar em C.

Um exemplo famoso e que já venceu é este, que imprime todos os números primos menores que 100. Vamos conferir os resultados de simples transformações no código do programa:

void primes(int cap) {
  int i, j, composite;
  for(i = 2; i < cap; i++) {
    composite = 0;
    for(j = 2; j < i; j++) 
      composite += !(i % j);
    if(!composite)
      printf("%d\t", i);
  }
}
 
int main() { 
  primes(100);
}

A primeira fase de transformações reduz a função primes: (1) O for é retirado e reescrito como um simples while contendo uma sequência de if-else; (2) O while é então escrito como recursão; (3) Os if-else em cascata são reescritos como um condicional apenas. Estas transformações já tornam o código consideravelmente obfuscated. O restante das transformações tem o objetivo de omitir detalhes da função: (4) remoção de variáveis intermediárias; (5) renomeação de variáveis para _, ___, etc; e, finalmente, (6) remoção de quaisquer espaços em branco e parênteses desnecessários.

Após esta primeira transformação:

void primes(int cap) { 
  int i, j, composite, t = 0;
  while(t < cap * cap) {
    i = t / cap;
    j = t++ % cap;
    if(i <= 1);
    else if(j == 0)
      composite = 0;
    else if(j == i && !composite)
      printf("%d\t",i);
    else if(j > 1 && j < i)
      composite += !(i % j);  
  }
}
 
int main() {
  primes(100);
}


O programa agora é transformado pela substituição do while por uma recursão. Isto requer a adição de dois parâmetros ao cabeçalho da função prime. Veja também que um bloco if-else adicional deve ser adicionado para que haja incremento na recursão quando nenhuma condição for obedecida:

void primes(int cap, int t, int composite) {
  int i,j;
  i = t / cap;
  j = t % cap;
  if(i <= 1)
    primes(cap,t+1,composite);
  else if(j == 0)
    primes(cap,t+1,0);
  else if(j == i && !composite)
    (printf("%d\t",i), primes(cap,t+1,0));
  else if(j > 1 && j < i)
    primes(cap,t+1, composite + !(i % j));
  else if(t < cap * cap)
    primes(cap,t+1,composite);
}
 
int main() {
  primes(100,0,0);
}

Agora os nomes das variáveis são mudados para apenas letras e substituição de if-else pelo operador condicional ternário (ex: if(A) B else if(C) D else E -> A ? B : C ? D : E):

void primes(int m, int t, int c) {
  int i,j;
  i = t / m;
  j = t % m;
  (i <= 1) ? primes(m,t+1,c) : (j == 0) ? primes(m,t+1,0) : (j == i && !c) ? 
  (printf("%d\t",i), primes(m,t+1,0)) : (j > 1 && j < i) ? 
  primes(m,t+1,c + !(i % j)) : (t < m * m) ? primes(m,t+1,c) : 0;
}
 
int main() {
  primes(100,0,0);
}

Agora o programa é transformado substituindo as variáveis i e j por (t / m) e (t % m), respectivamente:

void primes(int m, int t, int c) {
  ((t / m) <= 1) ? primes(m,t+1,c) : !(t % m) ? primes(m,t+1,0) : 
  ((t % m)==(t / m) && !c) ? (printf("%d\t",(t / m)), primes(m,t+1,0)) : 
  ((t % m)> 1 && (t % m) < (t / m)) ? primes(m,t+1,c + !((t / m) % (t % m))) : 
  (t < m * m) ? primes(m,t+1,c) : 0;
}
 
int main() {
  primes(100,0,0); 
}

Agora as variáveis m, t, e c são transformadas para _, __, ___, e ____, respectivamente:

void _(int __, int ___, int ____) {
  ((___ / __) <= 1) ? _(__,___+1,____) : !(___ % __) ? _(__,___+1,0) : 
  ((___ % __)==(___ / __) && !____) ? (printf("%d\t",(___ / __)), 
  _(__,___+1,0)) : ((___ % __) > 1 && (___ % __) < (___ / __)) ? 
  _(__,___+1,____ + !((___ / __) % (___ % __))) : (___ < __ * __) ? 
  _(__,___+1,____) : 0;

 
int main() {
  _(100,0,0); 
}

Finalmente, espaços em branco, declaração de tipos, e parênteses não-ambíguos são removidos para se chegar à fully obfuscated version:

_(__,___,____){___/__<=1?_(__,___+1,____):!(___%__)?_(__,___+1,0):___%__==___/
__&&!____?(printf("%d\t",___/__),_(__,___+1,0)):___%__>1&&___%__<___/__?_(__,1+
___,____+!(___/__%(___%__))):___<__*__?_(__,___+1,____):0;}main(){_(100,0,0);}

Informações (em inglês) sobre o IOCCC podem ser vistas em http://www.ioccc.org/

Exemplo de Obfuscated Hello Word:

#include "stdio.h"
#define e 3
#define g (e/e)
#define h ((g+e)/2)
#define f (e-g-h)
#define j (e*e-g)
#define k (j-h)
#define l(x) tab2[x]/h
#define m(n,a) ((n&(a))==(a))

long tab1[]={ 989L,5L,26L,0L,88319L,123L,0L,9367L };
int tab2[]={ 4,6,10,14,22,26,34,38,46,58,62,74,82,86 };

main(m1,s) char *s; {
    int a,b,c,d,o[k],n=(int)s;
    if(m1==1){ char b[2*j+f-g]; main(l(h+e)+h+e,b); printf(b); }
    else switch(m1-=h){
        case f:
            a=(b=(c=(d=g)<<g)<<g)<<g;
            return(m(n,a|c)|m(n,b)|m(n,a|d)|m(n,c|d));
        case h:
            for(a=f;a<j;++a)if(tab1[a]&&!(tab1[a]%((long)l(n))))return(a);
        case g:
            if(n<h)return(g);
            if(n<j){n-=g;c='D';o[f]=h;o[g]=f;}
            else{c='\r'-'\b';n-=j-g;o[f]=o[g]=g;}
            if((b=n)>=e)for(b=g<<g;b<n;++b)o[b]=o[b-h]+o[b-g]+c;
            return(o[b-g]%n+k-h);
        default:
            if(m1-=e) main(m1-g+e+h,s+g); else *(s+g)=f;
            for(*s=a=f;a<e;) *s=(*s<<e)|main(h+a++,(char *)m1);
        }
}

Mais exemplos em: http://www.cise.ufl.edu/~manuel/obfuscate/obfuscate.html

return 0

Abril 20, 2008

Debug – Limpar a Tela em C

Arquivado em: C/C++ — Tags:, , , , — computeiro @ 11:37 pm

Pode-se usar também a opção system(). Não tinha publicado antes porque é uma função dependente do sistema.

No GNU/Linux:

# include <stdio.h>

int main(int argc, char** argv)
{
    int n = 0;

     while(n++ < 11)
    {
        printf("%s\n%s\n%s\n%s\n",
               "Teste Limpa Tela!",
               "Teste Limpa Tela!",
               "Teste Limpa Tela!",
               "Teste Limpa Tela!");

           usleep(2000000); //funcao para dar uma pequena pausa

           system("clear"); //isto aqui limpa a tela
    }

     return 0;
}

No Windows:

# include <stdio.h>

int main(int argc, char** argv)
{
    int n = 0;

     while(n++ < 11)
    {
        printf("%s\n%s\n%s\n%s\n",
               "Teste Limpa Tela!",
               "Teste Limpa Tela!",
               "Teste Limpa Tela!",
               "Teste Limpa Tela!");

           usleep(2000000); //funcao para dar uma pequena pausa

           system("cls"); //isto aqui limpa a tela
    }

     return 0;
}

No Mac OS: Não faço a mínima idéia. Por sua herança UNIX, acredito que seja da mesma forma da citada acima (GNU/Linux). Testar é sempre bom. Como não tenho um Mac… Se alguém souber, por favor comente.

return 1

Abril 19, 2008

O Futuro dos Games

Arquivado em: games — Tags:, , — computeiro @ 1:06 pm

Há muitos avanços na área de games hoje em dia, e pra quem pensa que já chegamos no auge da tecnologia, o ser humano dá uma mostra de que a evolução está longe de parar. Nada de sedentarismo! Nada de jogar com a bunda na poltrona. O novo conceito de jogos abrange moviento, bastante movimento. Adeus joystick. Para jogar CS agora, você precisará ficar de pé, com as mãos esticadas, mexendo os braços e os dedos, apertando gatilhos imaginários, abaixando, esquivando-se, pulando, caindo. Confiram este protótipo para o PS3 (não poderia deixar de existir também para o Wii) :

return 0

Posts mais antigos »

Blog no WordPress.com.