O NeoMatrix Tech está de casa nova!

Você deverá ser redirecionado em 6 segundos. Se não, visite:
http://www.leonelfraga.com/neomatrixtech
e atualize seus favoritos.

Aviso IMPORTANTÍSSIMO!

Aviso aos navegantes:

O NeoMatrix Tech mudou de casa!!!

A partir de agora, acessem pelo novo endereço:

http://www.leonelfraga.com/neomatrixtech

Ué... mas é só o domínio mudou de lugar?

R: Na verdade, não é bem assim hehe. Este domínio que você acessa agora aponta para um blog hospedado no Blogger, enquanto no novo, aponta para um blog na plataforma Wordpress, hospedagem própria, muito mais rápida e com um layout mais agradável de ler ;)

Não vou fechar este domínio igual ao que eu fiz com o NM Light (que já está 100% na nova plataforma). Talvez beeeeeeem depois eu faça isso.

Todos os posts daqui se encontram lá, e novos posts serão colocados somente no novo endereço.
A única coisa que não consegui importar foram os comentários. Mas em breve vai ter um post contando sobre a epopéia que foi migrar o NeoMatrix Tech!

Somente vou fechar a área de comentários daqui. Caso queiram comentar, favor ver o post correspondente no "Novo NeoMatrix Tech" e comentem por lá. É bem melhor! (pena que os permalinks "amigáveis para SEO" não funcionam lá, dá erro 404 e não consigo fazer a configuração funcionar. E olha que eu já vi vários artigos falando desse assunto :( ).

Quem assina o feed, já está lendo o conteúdo do novo NeoMatrix Tech!

quarta-feira, 29 de abril de 2009

Você tem liberdade criativa na sua empresa?

brain

Você que é desenvolvedor ou programador, tem a liberdade para fazer inovações de código, bolar frameworks, metodologias de desenvolvimento ou outros na sua empresa?

Ou apenas programa seguindo uma “linha de produção” previamente definida, fazendo somente aquilo que o script manda sem dar sugestões de novas tecnologias e afins?

Aqui no NeoMatrix Tech tenho pelo menos dois grandes exemplos de coisas que utilizo na empresa que trabalho e que ou criei do zero, ou fiz grandes melhoramentos: A Classe de Conexão e o Sistema de Controle de Acesso.

Ambos os itens mencionados acima são largamente utilizados nos projetos de onde eu trabalho, e inclusive a metodologia de desenvolver a interface do programa separada das classes de negócio eu que comecei a adotar.

Quando fico um tempo ocioso, começo a pesquisar sobre algumas coisas e fazer vários testes de código, crio programas que não tem muita funcionalidade, porém lá na frente aquilo poderá ser muito útil.

Foi assim que construí um gerador de classes C# que lê uma tabela de um banco de dados e cria uma classe C#, utilizando-se dos métodos padronizados da Classe de Conexão. Só uma afinada depois e temos tudo funcionando.

Estes exemplos foram para ilustrar que se você, na sua empresa, goza de certas liberdades consegue criar muitas coisas que inclusive torna-se padrão na empresa.

215200821544Yahoo_Criativos_nota Mas estas liberdades estão fortemente atreladas ao tipo de empresa que você trabalha e do seu cargo, logicamente.

Supondo que você trabalhe em uma fábrica de software de grande porte no cargo de programador, sua tarefa será a de atender as especificações que são repassadas pelo analista, praticamente sem pestanejar.

Terá que seguir à risca as especificações técnicas do projeto: utilizar, se houver, o framework determinado, convenções de nome de variáveis, classes, o que for, e fazer todo o programa dentro do prazo, que geralmente é muito curto.

Com o prazo curto e a obrigação de seguir especificações, a liberdade criativa do programador fica bem (para não dizer totalmente) podada.

Não sobra tempo para pesquisar, e as pesquisas são feitas com o intuito de apenas resolver um problema específico e pontual, mais nada.

A criação de padrões nesse tipo de empresa fica a cargo dos analistas ou gerentes, que também tem o trabalho de homologar e treinar o pessoal para seguir as novas metodologias, novas ferramentas, frameworks, etc.

Agora, como no meu caso, que trabalho em empresa de porte pequeno, e na minha “posição” de ser a pessoa mais “experiente” em C# lá, fica mais fácil definir a forma na qual trabalho, principalmente no que diz respeito às ferramentas utilizadas e os padrões de codificação, reaproveitamento de código, essas coisas.

E particularmente eu gosto exatamente desse tipo de serviço: pesquisar novos códigos, padrões, repassar estes padrões, ou seja, suporte ao desenvolvimento. Também gosto da parte de análise, aquela fase antes de surgir as linhas de código, o contato com o cliente no que diz respeito ao negócio em si. Já a parte de helpdesk, principalmente quando muitos projetos estão na minha mão no que diz respeito a programação, sinceramente eu não curto. Fica muito complicado administrar as coisas, o foco acaba sendo perdido e até recuperá-lo leva um bom tempo. Mas isso é assunto para outro post.

E para isso, liberdade para criar coisas é necessária.

Afinal, já que será de minha responsabilidade assumir o posto de “mentor”, precisarei do máximo de recursos possíveis para ajudar a quem necessitar.

E convenhamos: se você tem liberdade criativa, aproveita essa liberdade e se destaca, as coisas ficam muito boas para você, em todos os sentidos.

Ganha a confiança de quem está a sua volta, o reconhecimento, ou seja, realização profissional. Principalmente se faz o que gosta, o que é o meu caso.

E você, tem liberdade para criar e definir padrões na sua empresa?

Um abraço!

Leia o restante deste post...

sábado, 25 de abril de 2009

Armadilhas do C# – Atribuições, população de listas e referências

Uma vez precisei corrigir uma aplicação (lembra daquela que comentei no último Momento POG quando abordei o GOTO?) que necessitava enviar mensagens para o webservice, e quando mais de uma mensagem era mandada TODAS as mensagens eram enviadas apenas com a última buscada.

Vou explicar melhor:

De acordo com um assunto, era populada uma lista a partir de um banco de dados, porém no final do código todos os itens desta lista ficavam iguais ao último item que era buscado da base.

Você consegue notar a diferença entre os códigos abaixo, depois do break?

Código I:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4:  
   5: namespace ConsoleApplication1
   6: {
   7:     public class Teste
   8:     {
   9:         public string algumacoisa = "";
  10:     }   
  11:     
  12:     class Program
  13:     {
  14:         static void Main(string[] args)
  15:         {
  16:             string[] lista = new string[3] { "Primeiro", "Segundo", "Terceiro" };            
  17:             List<Teste> l = new List<Teste>();
  18:             Teste x = new Teste();
  19:             foreach (string s in lista)
  20:             {
  21:                 x.algumacoisa = s;
  22:                 l.Add(x);
  23:             }
  24:             foreach (Teste saida in l)
  25:             {
  26:                 Console.WriteLine(saida.algumacoisa);
  27:             }
  28:             Console.ReadKey();
  29:         }
  30:     }
  31: }

Código II:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4:  
   5: namespace ConsoleApplication1
   6: {
   7:     public class Teste
   8:     {
   9:         public string algumacoisa = "";
  10:     }   
  11:     
  12:     class Program
  13:     {
  14:         static void Main(string[] args)
  15:         {
  16:             string[] lista = new string[3] { "Primeiro", "Segundo", "Terceiro" };            
  17:             List<Teste> l = new List<Teste>();
  18:             foreach (string s in lista)
  19:             {
  20:                 Teste x = new Teste();
  21:                 x.algumacoisa = s;
  22:                 l.Add(x);
  23:             }
  24:             foreach (Teste saida in l)
  25:             {
  26:                 Console.WriteLine(saida.algumacoisa);
  27:             }
  28:             Console.ReadKey();
  29:         }
  30:     }
  31: }

Exceto pela variável “x” (um objeto da classe Teste) que é declarada fora do laço foreach no Código I, enquanto que no Código II ela é declarada dentro do laço, não há nenhuma outra diferença entre eles.

Mas esta sutil diferença de código modificou COMPLETAMENTE o resultado do programa. Vejam as capturas de tela com o resultado da execução dos dois programas:

Código I:

Resultado do Código I (Errado)Código II:

Resultado do Código II (Correto)Mas por que isso ocorreu?

Quando estamos trabalhando com um objeto, no nosso caso a variável “x”, e utilizamos o comando new() estaremos criando uma referência do mesmo na memória. Quando, em um List ou em qualquer outra coleção adicionamos este objeto dentro de seus itens, na verdade estaremos adicionando esta referência de memória do nosso objeto.

No Código I, ao fazer a iteração do array lista, atribuímos seus valores dentro da instância de Teste em x na propriedade “algumacoisa” e em seguida adicionamos este objeto no List<> l.

Como fazemos três iterações, adicionamos três objetos dentro do List<> não é? ERRADO.

Na verdade, adicionamos a referência à variável x três vezes, e como ela foi inicializada apenas uma vez com o comando new adicionamos a mesma referência três vezes.

Então, ao modificar o valor desta referência, estaremos modificando em todos os lugares onde ela é mencionada, no nosso caso, em cada item do List<> l.

Já no Código II, ao criar uma nova instância da classe Teste em x a cada iteração, estaremos adicionando ao nosso List<> três referências diferentes, sendo que ao final de cada iteração a referência criada existirá apenas dentro do List<>. E como x tem escopo apenas dentro do laço foreach, não poderemos mais utilizá-la, sendo que para acessar cada referência criada a partir de agora, só a partir do List<>.

Como você viu, um detalhezinho sutil e que fez uma diferença tremenda…

Um abraço! 

Leia o restante deste post...

segunda-feira, 20 de abril de 2009

Oracle compra a Sun Microsystems por mais de US$ 7 bi

oracle e sun

É meu amigo! Depois de dizer NÃO para a IBM, a Oracle, como bom mineirinho, comeu quieto e comprou a Sun Microsystems por US$ 9,50 por ação, totalizando mais de sete bilhões de dólares.

Veja o trecho da matéria no G1:

As empresas informaram em comunicado que a operação é avaliada em cerca de US$ 7,4 bilhões, ou US$ 5,6 bilhões sem incluir caixa e dívidas da Sun. As ações da Sun saltavam mais de 37% no pregão eletrônico da Nasdaq, em Nova York, enquanto os papéis da produtora de software corporativo recuavam 4,5%.

A Oracle espera que a aquisição adicione pelo menos US$ 0,15 por ação no primeiro ano após a aquisição. A companhia, diz a agência de notícias Associated Press, estima que a Sun contribuirá com mais de US$ 1,5 bilhão no primeiro ano, e mais de US$ 2 bilhões no segundo ano.

O anúncio surpreendente feito pelas empresas acontece depois que as negociações entre IBM e a Sun fracassaram no início deste mês. Fontes próximas do assunto afirmaram que a Sun recusou oferta de US$ 9,4 por ação feita pela IBM.

Fonte: G1

Depois dessa notícia, a coisa que mais foi questionada pelas comuindades (não só a de software livre e dos javeiros) : Qual será o futuro do MySQL e do OpenOffice? (via br-linux).

Segundo este FAQ publicado no site da Oracle, ele será adicionado ao rol de produtos da Oracle, que inclui o Oracle Database 11g e outros, inclusive os open-source Berkeley DB (que também é utilizado como mecanismo de armazenamento do Subversion) e Inno DB (um dos mecanismos de armazenamento – engine - do MySQL).

A Sun comprou a MySQL AB por uma quantia bilhonária, e desde então o banco vem ganhando recursos, embora a Sun receba inúmeras críticas da comunidade por causa da extrema burocracia no desenvolvimento, críticas estas que também recebe em relação ao OpenOffice (inclusive já estavam falando que o projeto “estava na UTI”).

Uma suíte de escritórios não é o foco da Oracle, e embora a Sun estivesse dando mais atenção ao StarOffice, creio eu que será um dos produtos mais afetados por causa da aquisição da Sun pela Oracle.

O melhor que eu acho é entregar o desenvolvimento do OpenOffice para a comunidade. O seu “fork” mais famoso, o Lotus Simphony da IBM ainda tem muito arroz com feijão para comer.

Agora que a Oracle adquiriu um nome de respeito em se tratando de hardware e sistema operacional, a concorrência com a dupla MS + Intel ficou ainda mais acirrada.

Vejamos: Qual é o servidor mais utilizado para rodar o Oracle Database em aplicações parrudas e de missão crítica? Hardware Sun, com sistema operacional Solaris. Hardware Intel e Windows combinam mais com SQL Server, na minha opinião.

Esse “trio dinâmico” (Processadores SPARC, Solaris e Oracle) agora tem muito mais a ganhar, agora que o desenvolvimento destes itens tende a ser mais integrado.

Isso por que eu ainda não falei nada de Java até agora.

As ferramentas da Oracle são feitas em Java, podemos escrever stored procedures no Oracle DB com Java, o instalador gráfico do Oracle é em Java.

E convenhamos, o desempenho destas ferramentas (estou falando mais precisamente do Database Developer, que tem uma JVM própria) no sistema Windows é sofrível se compararmos com uma ferramenta feita em outra linguagem.

Tomara que agora estas ferramentas sejam muito melhoradas, pois como mesmo com as empresas distintas Oracle e Java tem um grau bem elevado de integração, estas melhorias são meio que óbvias, não é?

Então, que esta aquisição sirva para uma maior concorrência no mercado, e que os diretores tomem o caminho adequado dos nossos “xodós” do Software de Código Aberto ;-)

Leia o restante deste post...

quarta-feira, 15 de abril de 2009

Momento POG: O famoso GOTO

Muito “discriminado” pelos programadores mais experientes, e os mais novos raramente usam, a instrução GOTO virou sinônimo de Gambiarra.

goto

Existente desde os primórdios da programação, serve basicamente para saltarmos incondicionalmente para um ponto do programa, geralmente determinado por um label (não, não é o componente de interfaces gráficas que você está pensando não).

Substituído por IF’s e outras estruturas de controle de fluxo, ninguém lembra que ele existe.

Mas até mesmo em C# ele me salvou de algumas :-)

Tive que terminar um Console Application cuja função é verificar uma caixa de e-mail a cada tantos segundos, e ao pressionar a tecla “Q” a aplicação se encerrava.

Verificar a caixa a cada tantos segundos… imediatamente me veio a idéia de instanciar um Timer, coisa que eu fiz: Configurei no método Main() da aplicação o timer e tal.

Só que aí veio um pequeno problema: o método Main() era executado e a aplicação saia do ar.

Me vieram algumas idéias:

1. Fazer a aplicação esperar uma tecla: Coloquei um método ReadKey(), pois assim o fluxo do método Main() ficaria esperando até que o usuário pressionasse uma tecla, porém o Timer ficaria executando em uma thread a parte (isso é automático), mas teria o problema do usuário ir lá, apertar QUALQUER tecla e a aplicação sai do ar.

   1: static void Main(string[] args)
   2: {
   3:     /*Declaração e configuração do timer...*/
   4:  
   5:     Console.Write("Pressione qualquer tecla para sair...");
   6:     Console.ReadKey();
   7:  
   8: }

2. Fazer um looping até que uma determinada tecla seja pressionada: Como eu disse acima, somente ao pressionar a tecla “Q” é que o programa deveria sair do ar. Veja como ficou o código:

   1: static void Main(string[] args)
   2: {
   3:     /*Declaração e configuração do timer...*/
   4:  
   5:     ConsoleKeyInfo k = new ConsoleKeyInfo();
   6:     Console.Write("Pressione 'Q' para sair...");
   7:     while (!k.KeyChar.ToString().ToUpper().Equals("Q"))
   8:     {
   9:         k = Console.ReadKey();
  10:     }
  11: }

O timer continuaria executando em uma thread à parte, porém temos um probleminha: O looping faz o programa consumir praticamente toda a CPU para si! E como o servidor onde vai rodar esse bicho BOMBA, isso é inadmissível.

3. A Solução definitiva: Como “prender” a saída da aplicação a uma determinada tecla, modificando o fluxo do método Main() sem usar um looping? Foi com essa idéia que tive o insight de usar o famigerado GOTO com o auxílio de um if:

   1: static void Main(string[] args)
   2: {
   3:     /*Declaração e configuração do timer...*/
   4:                 
   5:     ConsoleKeyInfo k = new ConsoleKeyInfo();
   6:     Console.Write("Pressione 'Q' para sair...");
   7:     fluxo:
   8:     k = Console.ReadKey();
   9:     if (!k.KeyChar.ToString().ToUpper().Equals("Q"))
  10:     {
  11:         goto fluxo;
  12:     }
  13: }

Como você pode ver, declarei o label fluxo antes da instrução que faz a aplicação guardar uma tecla, e após uma tecla ser pressionada é feita uma verificação: Se for diferente de “Q”, o programa volta para a instrução de aguardar uma tecla.

Com isso, o programa não consome muita CPU e o meu Timer ficou executando em outra thread, e fazendo o que tem que fazer!

PS: Já prevendo, eu sei que para este caso a melhor alternativa seria fazer um Windows Service, porém eu ainda não sei como construir um (e nem tive tempo de dar uma googlada sobre o assunto :-( ). Como o programa em si está em uma biblioteca de classes, a implementação é muito simples, pois é só instanciar a classe e chamar os métodos dentro do evento OnElapsed de um Timer (igual foi feito no Console Application).

Um abraço!

Leia o restante deste post...

quarta-feira, 8 de abril de 2009

O Speedy da Telefônica e seu DNS…

Desde segunda-feira, dia 06/04/2009 os usuários do serviço Speedy da Telecômica, ops, Telefônica estão enfrentando problemas ao entrar em alguns sites e a conexão fica instável.

Logo do Speedy

Eu também uso o Speedy, aliás, esta é a única opção de banda-larga que tenho em meu bairro (não estou considerando os pacotes 3G das operadoras de celular) e eu, assim como muitos amigos estão passando por esse problema. Porém eu consegui até contornar o problema, continuem lendo para saber como eu fiz :-)

Questionada ontem (05/04/2009) a Telefônica não adimitia a instabilidade do serviço, mas hoje já falou que estão verificando.

Fontes me informaram que a Telefônica está fazendo manutenção em alguns servidores para agregar novos produtos, como um pacote que oferecerá antivírus e firewall.

Mas essa manutenção afetou justamente os servidores DNS.

Como cheguei a esta conclusão?

Primeiramente tentei entrar em um website com o Firefox e ele dava página não encontrada. Para saber se eu estava conectado, abri o prompt de comando do Vista (Iniciar –> Executar –> cmd) e dei um ping para o google com o seguinte comando: ping www.google.com

O retorno do ping acusava que não achava o host de destino, daí fiz um outro teste dando outro ping, so que dessa vez para o endereço IP da empresa onde trabalho.

E esse IP respondeu ao meu ping.

Hum… não consigo pingar para um domínio mas consigo pingar para um IP. Isso está me cheirando falha de servidores DNS da Telecômica!

A solução foi alterar os servidores DNS usados pelo Speedy!

Nesse momento me veio a idéia de usar o Open DNS no meu roteador, mas como obter os endereços IP do mesmo? Uma pesquisa no Google acessado através do meu celular me deu tudo o que queria :-)

Os endereços IP do Open DNS são:

Primário: 208.67.222.222
Secundário: 208.67.220.220

E como eu configuro essa joça?

Se você possui um roteador da D-Link (eu tenho um router wireless DI-624, mas o tutorial serve para outros modelos de router ou até mesmo modems de banda-larga que também fazem esse papel, só não possuem o switch conjugado a ele.), entre em sua tela de administração, geralmente através do IP http://192.168.0.1, entre com o usuário e a senha e logo na home-page, na guia Home acesse a opção WAN no menu lateral.

Observem a tela abaixo:

Config do Roteador D-Link Configure os endereços DNS Primário e Secundário com os do Open DNS, de Apply e reinicie a conexão. Recomendo dar um bumba no caneco tanto no roteador quanto no modem.

Para outros modelos de roteador, consulte a sua documentação ou dê uma boa fuçada nele ;-)

Uso Speedy, como posso saber se meu modem também é um roteador só que com apenas uma porta LAN e não me informaram disso? Se você não precisar clicar em um ícone de conexão de rede no Windows, ou seja, é só ligar o modem, ligar o PC e conectar, provavelmente ele possui esta função.

Outra forma de saber é abrir um prompt de comando (Inciar –> Executar –> digite cmd e dê enter) e dar o comando ipconfig /all. A saída deste comando listará as propriedades das suas conexões de rede. Procure por aquela que está conectada ao seu modem e anote o endereço do Gateway Padrão.

Abra um navegador e coloque http://<o ip do gateway padrão> e veja se ele pede usuário e senha. Aconteceu isso? Então ele tem boas chances de ser um router.

Dê uma olhadinha no screenshot abaixo:

Saída do comando ipconfig /allAgora, se você necessita de clicar em um ícone (provavelmente no seu desktop) para conectar ao Speedy, vá no gerenciador de conexões de rede (no XP: Iniciar –> Painel de Controle –> Conexões de Rede; no Vista: Iniciar –> Painel de Controle –> Central de Redes e Compartilhamento –> Gerenciar Conexões de Rede no menu lateral) (ou pode até ser pelo ícone na sua área de trabalho), dê um duplo clique no ícone correspondente à sua conexão de banda-larga e clique no botão Propriedades. A tela correspondente à sua conexão deve parecer-se com esta:

Tela de conexão de banda-larga no XPClicando em Propriedades, vamos até a guia Redes e selecionar a opção Protocolo TCP/IP:

Propriedades da conexão de banda-larga no XPNas opções do Protocolo TCP/IP, selecione a opção “Usar os seguintes endereços de servidor DNS” e entre com os endereços IP do Open DNS nos campos correspondentes e confirme dando OK. Mantenha a opção “Obter um endereço IP automaticamente” marcada.

Propriedades de TCP/IP no XPConfirme nas outras telas, conecte o Speedy e seja feliz (pelo menos eu estou sendo hehe).

Um abraço!

Leia o restante deste post...

sábado, 4 de abril de 2009

Repercussão do FUD da Symantec

Nunca pensei que iria ter alguma repercussão o meu post sobre um FUD sutil que a empresa Symantec fez com as ferramentas de segurança gratuítas, mas ao ver este post do Chris B., que cita o meu post, vi que a coisa tomou uma dimensão além do que eu imaginava.

how-to-stop-virus_intocomputer

Nos comentários do post no blog do Chris, uma funcionária da Edelman, a agência de comunicação da Symantec, diz que essa campanha é “um convite à reflexão sobre o valor da informação e a importância da proteção online diante dos riscos que a Internet oferece”.

Sim, nossos dispositivos computacionais (PC, notebook, celular, pendrive, netbook, smartphone, players de mídia entre outros) guardam muitas vezes informações sensíveis e muito valiosas.

E hoje em dia, nossos dados também estão na “núvem”.

Uma ferramenta de segurança SOMADA com o comportamento do usuário são necessárias para deixar estas informações sensíveis o mais seguro possível.

Mas, ao instalar um conjunto de ferramentas de segurança, seja um antivírus, firewall, antispyware, antrootkit entre outros, você “sente-se mais protegido” ou está “efetivamente seguro”?

Sentir-se mais protegido e estar efetivamente seguro são duas coisas distintas.

Ao instalar um antivírus, por exemplo, a nossa sensação de segurança aumenta, e nós somos induzidos a continuar a manter uma rotina as vezes “perigosa” em termos de navegação na Internet. Principalmente um usuário com menos experiência: ele acha que a ferramenta poderá resolver 100% dos problemas que acontecerem.

Um fator muito importante e que NENHUMA ferramenta de segurança, seja BEM paga anualmente ou freeware, é capaz de oferecer é a proteção contra a engenharia social.

Essa é a grande técnica que os crackers utilizam para roubar os dados do usuário. Ele pode ganhar a confiança do sujeito mais incauto a ponto de fazê-lo desabilitar a ferramenta em questão. Aí, meu amigo, não tem jeito mesmo.

Tanto uma ferramenta grátis ou uma paga são capazes de oferecer ao usuário a sensação de segurança, protegendo das pragas virtuais mais comuns, e embora as ferramentas pagas possuirem mais recursos que as gratuítas, nenhuma ferramenta livra o usuário de se proteger contra a engenharia social.

Critiquei ferozmente a campanha da Symantec em questão justamente por fazer um ataque (sutil, mas qualquer hard user é capaz de detectar e fazer a analogia correta à frase da campanha) às ferramentas grátis (e que no meu caso funcionam muito bem) ao invés de atacar no ponto chave de qualquer infecção.

E para chegar no ponto de uma empresa usar as técnicas de FUD, é porque ela está com medo e não confia muito no seu taco hehehe.

Gostei do fato de uma pessoa que representa a Symantec ter se manifestado, sendo que foi aqui no NM Tech que foi “plantada essa semente” hehe.

E para não falar que odeio a Symantec por causa disso, eu acho o desfragmentador Speed Disk excelente, é o meu favorito.

Um abraço!

Leia o restante deste post...

quarta-feira, 1 de abril de 2009

1º de Abril no mundo Tech

E aí, pregou muitas peças nas pessoas hoje?

Olha só o que rolou de legal em alguns sites aí:

Microsoft desenvolve tecnologia cronotemporal para combater bugs: É, o pessoal do Tio Bill querendo corrigir os problemas o mais rápido possível.

Novos chips ARM tem rede neural viva: E literalmente! Será que os bichanos vão ficar de olho nos nossos smartphones e cia ltda?

Cantor brasileiro contesta nome de popular gerenciador de pacotes: Nossa, como foram desenterrar o RPM!!! Sacada legal essa :P

E de onde tirei esses tem mais.

Só faltava dizer que finalmente o Yahoo foi vendido para a Microsoft, que o Google comprou o Twitter, que a MS irá disponibilizar o fonte do Windows, que o Linux iria ser de código fechado, que os freetards só de raiva irão usar Windows, que o NM Tech iria se fundir com o NM Light e eu iria falar só sobre BBB e cia e viraria um appletard…

Abraços!

Leia o restante deste post...

Sobre o NeoMatrix Tech

Meu blog para assuntos profissionais, ligado com tecnologia.
Dicas de programação (grande parte de C# e ASP.NET, mas não limitado a essa plataforma :-) ), dicas de utilitários, análises de equipamentos e serviços, resenhas sobre sites que eu visito, relacionados com tecnologia, opinião sobre mercado de trabalho, metodologias de desenvolvimento, comportamento no mundo tecnológico...

NeoMatrix Light

  © Blogger templates ProBlogger Template by Ourblogtemplates.com 2008 - Editado e configurado por Leonel F.

Voltar ao TOPO