quinta-feira, novembro 30, 2006

Desafio Homem X Máquina: Kramnik vs Deep Fritz



O atual campeão mundial de xadrez Vladimir Kramnik está enfrentando o software de xadrez Deep Fritz 10
(foto: Schwarti)














No jogo 2 Kramnik comteu um erro impressionante para um campeão mundial!
Acompanhe:

Deep Fritz 10 - Kramnik,V (2750) [D10]
Man vs Machine Bonn, Germany (2), 27.11.2006
1.d4 d5 2.c4 dxc4 3.e4 b5 4.a4 c6 5.Nc3 b4 6.Na2 Nf6 7.e5 Nd5 8.Bxc4 e6 9.Nf3 a5 10.Bg5 Qb6 11.Nc1 Ba6 12.Qe2 h6 13.Be3 Bxc4 14.Qxc4 Nd7 15.Nb3 Be7 16.Rc1 0-0 17.0-0 Rfc8 18.Qe2 c5 19.Nfd2 Qc6 20.Qh5 Qxa4 21.Nxc5 Nxc5 22.dxc5 Nxe3 23.fxe3 Bxc5 24.Qxf7+ Kh8 25.Qf3 Rf8 26.Qe4 Qd7 27.Nb3 Bb6 28.Rfd1 Qf7 29.Rf1 Qa7 30.Rxf8+ Rxf8 31.Nd4 a4 32.Nxe6 Bxe3+ 33.Kh1 Bxc1 34.Nxf8. Now 34...Kg8 35.Ng6 Bxb2 36.Qd5+ Kh7 37.Nf8+ Kh8 38.Ng6+ é o empate forçado. Mas Kramnik jogou 34...Qe3?? Seria esse o erro do século?

A Evolução dos Programadores


Mais uma da série: "Para que simplificar se a gente pode complicar?" A evolução do programador do ponto de vista do "Hello World"!











Colegial:

  10 PRINT "HELLO WORLD"
20 END

Primeiro ano da faculdade:

  program Hello(input, output)
begin
writeln('Hello World')
end.

Formando da Faculdade:

  (defun hello
(print
(cons 'Hello (list 'World))))

Profissional recém contratado:

  #include 
void main(void)
{
char *message[] = {"Hello ", "World"};
int i;

for(i = 0; i <>

Profissional Senior:

    #include 
#include

class string
{
private:
int size;
char *ptr;

string() : size(0), ptr(new char[1]) { ptr[0] = 0; }

string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}

~string()
{
delete [] ptr;
}

friend ostream &operator <<(ostream &, const string &); string &operator=(const char *); }; ostream &operator<<(ostream &stream, const string &s) { return(stream << operator="(const" size =" strlen(chrs); " ptr =" new" str = "Hello World">

Programador Master:

  [
uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
]
library LHello
{
// bring in the master library
importlib("actimp.tlb");
importlib("actexp.tlb");

// bring in my interfaces
#include "pshlo.idl"

[
uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
]
cotype THello
{
interface IHello;
interface IPersistFile;
};
};

[
exe,
uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
]
module CHelloLib
{

// some code related header files
importheader();
importheader();
importheader();
importheader("pshlo.h");
importheader("shlo.hxx");
importheader("mycls.hxx");

// needed typelibs
importlib("actimp.tlb");
importlib("actexp.tlb");
importlib("thlo.tlb");

[
uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
aggregatable
]
coclass CHello
{
cotype THello;
};
};

#include "ipfix.hxx"

extern HANDLE hEvent;

class CHello : public CHelloBase
{
public:
IPFIX(CLSID_CHello);

CHello(IUnknown *pUnk);
~CHello();

HRESULT __stdcall PrintSz(LPWSTR pwszString);

private:
static int cObjRef;
};

#include
#include

#include
#include
#include "thlo.h"
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"

int CHello::cObjRef = 0;

CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
{
cObjRef++;
return;
}

HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString)
{
printf("%ws
", pwszString);
return(ResultFromScode(S_OK));
}

CHello::~CHello(void)
{

// when the object count goes to zero, stop the server
cObjRef--;
if( cObjRef == 0 )
PulseEvent(hEvent);

return;
}

#include
#include
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"

HANDLE hEvent;

int _cdecl main(
int argc,
char * argv[]
) {
ULONG ulRef;
DWORD dwRegistration;
CHelloCF *pCF = new CHelloCF();

hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

// Initialize the OLE libraries
CoInitializeEx(NULL, COINIT_MULTITHREADED);

CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE, &dwRegistration);

// wait on an event to stop
WaitForSingleObject(hEvent, INFINITE);

// revoke and release the class object
CoRevokeClassObject(dwRegistration);
ulRef = pCF->Release();

// Tell OLE we are going away.
CoUninitialize();

return(0); }

extern CLSID CLSID_CHello;
extern UUID LIBID_CHelloLib;

CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */
0x2573F891,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
0x2573F890,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

#include

#include
#include
#include
#include
#include "pshlo.h"
#include "shlo.hxx"
#include "clsid.h"

int _cdecl main(
int argc,
char * argv[]
) {
HRESULT hRslt;
IHello *pHello;
ULONG ulCnt;
IMoniker * pmk;
WCHAR wcsT[_MAX_PATH];
WCHAR wcsPath[2 * _MAX_PATH];

// get object path
wcsPath[0] = '';
wcsT[0] = '';
if( argc > 1) {
mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
wcsupr(wcsPath);
}
else {
fprintf(stderr, "Object path must be specifiedn");
return(1);
}

// get print string
if(argc > 2)
mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
else
wcscpy(wcsT, L"Hello World");

printf("Linking to object %wsn", wcsPath);
printf("Text String %wsn", wcsT);

// Initialize the OLE libraries
hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

if(SUCCEEDED(hRslt)) {

hRslt = CreateFileMoniker(wcsPath, &pmk);
if(SUCCEEDED(hRslt))
hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

if(SUCCEEDED(hRslt)) {

// print a string out
pHello->PrintSz(wcsT);

Sleep(2000);
ulCnt = pHello->Release();
}
else
printf("Failure to connect, status: %lx", hRslt);

// Tell OLE we are going away.
CoUninitialize();
}

return(0);
}

Hacker Aprendiz:

  #!/usr/local/bin/perl
$msg="Hello, world.n";
if ($#ARGV >= 0) {
while(defined($arg=shift(@ARGV))) {
$outfilename = $arg;
open(FILE, ">" . $outfilename) || die "Can't write $arg: $!n";
print (FILE $msg);
close(FILE) || die "Can't close $arg: $!n";
}
} else {
print ($msg);
}
1;

Hacker Sênior:

  #include 

#define S "Hello, Worldn"
main(){exit(printf(S) == strlen(S) ? 0 : 1);}

Hacker "Rodado":

  % cc -o a.out ~/src/misc/hw/hw.c
% a.out

Guru Hacker:

  % echo "Hello, world."

Novo Gerente:

  10 PRINT "HELLO WORLD"
20 END

Gerente Médio:

  mail -s "Hello, world." bob@b12
Bob, por favor, você pode escrever um programa que imprima "Hello, world."?
Preciso disso pra amanhã!.
^D

Gerente Senior:

  % zmail jim
Preciso de um programa "Hello, world." para essa tarde!

Presidente:

  % letter
letter: Comando não encontrado.
% mail
Para: ^X ^F ^C
% help mail
help: Comando não encontrado.
% porra!
!: Evento não reconhecido
% logout


Fonte: The Evolution Programmer

Xadrez do futuro?

sexta-feira, novembro 17, 2006

quarta-feira, novembro 15, 2006

Instalando Samba e Swat no Ubuntu














O Samba é um servidor Linux de compartilhamento e gerenciamento de recursos em redes formadas por computadores com clientes Windows, através do protocolo SMB (Server Message Block)/CIFS (Common Internet File System), equivalentes a implementação NetBEUI no Windows. Desse modo, pode-se usar o Linux como servidor de arquivos, servidor de impressão, entre outros servidores, para os clientes que rodam Windows (NT, 2000, XP, Server 2003).
O Swat é uma ferramenta de manutenção do Samba através da web, facilitando seu gerenciamento.
Para quem quer economizar uns trocados com a compra de um Win Server, ou para quem prefere mesmo os ambientes Unix-Like, o Samba é uma ferramenta já bastante usada.

- Para instalar o Samba no seu Ubuntu, via terminal entre com o comando:
#sudo apt-get install samba smbfs

- Para gerenciar os usuários de sua rede no Samba, entre os comandos via terminal:
#sudo smbpasswd -a system_username

Crie um arquivo novo de nome "smbusers"
#sudo gedit /etc/samba/smbusers

Adicione essa linha no novo arquivo:
system_username = "network username"

O "network username", que é o nome do usuário da sua rede Windows, deve ir entre aspas mesmo.

- Para criar os usuários no seu Ubuntu/Samba:
#sudo smbpasswd -a system_username

- Para deletar usuários no Samba:
#sudo smbpasswd -x system_username

- Para compartilhar pastas home somente leitura:
#sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
#sudo gedit /etc/samba/smb.conf


Encontre essa linha:
...
; security = user
...


Troque por essa:
security = user
username map = /etc/samba/smbusers


Salve o arquivo e restart o Samba:
#sudo testparm
#sudo /etc/init.d/samba restart


- Para compartilhar pastas home com escrita/leitura:
#sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
#sudo gedit /etc/samba/smb.conf


Encontre essa linha:
...
; security = user
...


Troque por essa:
security = user
username map = /etc/samba/smbusers


Nesse arquivo smb.conf, encontre essa seção:
...
# By default, the home directories are exported read-only. Change next
# parameter to 'yes' if you want to be able to write to them.
writable = no
...


e troque as linhas acima por essas:
# By default, the home directories are exported read-only. Change next
# parameter to 'yes' if you want to be able to write to them.
writable = yes


Salve o arquivo e restart o Samba:
#sudo testparm
#sudo /etc/init.d/samba restart


- Para compartilhar pastas de grupo com leitura/escrita:
#sudo mkdir /home/group
#sudo chmod 777 /home/group/
#sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
#sudo gedit /etc/samba/smb.conf


Encontre essa linha:
...
; security = user
...


e substitua por essa:
security = user
username map = /etc/samba/smbusers


e também adicione essa linhas no fim do arquivo:
[Group]
comment = Group Folder
path = /home/group
public = yes
writable = yes
valid users = system_username1 system_username2
create mask = 0700
directory mask = 0700
force user = nobody
force group = nogroup


(lembrando claro de substituir "system_username1", etc pelo usuário real e "/home/group" pela pasta de sua escolha)

Salve o arquivo e restart o Samba:
#sudo testparm
#sudo /etc/init.d/samba restart


Para instalar o Swat, é bem simples. Isso pode ser feito pelo Gerenciador de Pacotes Synaptic: basta fazer uma busca por "Swat", marcar a seleção, aplicar e pronto!

Feito isso, instale o inetd:
#sudo apt-get install netkit-inetd

Restart o inetd:
#sudo /etc/init.d/inetd restart

Veja se o arquivo /etc/inetd.conf tem essa linha descomentada:
swat stream tcp nowait.400 root /usr/sbin/swat swat

e aponte seu browser para http:/ip_servidor/:901

Um detalhe...o Swat edita o arquivo smb.conf, mas também limpa todos os comentários que você tenha feito nele. Portanto é melhor fazer uma cópia do arquivo antes de usar o Swat.

Bons compartilhamentos!

sábado, novembro 11, 2006

A paranóia das metricas de software


Estava lendo um artigo no blog do Joel Spolsky (na verdade, a fonte original que me levou ao artigo foi um post do blog do Phillip Calçado , o "Shoes") que diz que a maioria das empresas de desenvolvimento de software tendem a recompensar os programadores que escrevem mais linhas de código e resolvem mais bugs.
Fica claro que a qualidade despenca, uma vez que seria melhor gastar o tempo escrevendo código sem tantos bugs.

O caso mais extremo da paranóia das metas/métricas fica por conta do exemplo da Amazon: como a medida de satisfação dos clientes é mensurada de acordo com o número de chamadas por hora, os atendentes simplesmente desligam na cara do cliente, para não perder tempo com uma única chamada e, assim, aumentar o número de atendimentos.
Coisa de maluco!

Confira aqui o artigo completo

sexta-feira, novembro 10, 2006

Alavancando a carreira

Google fazendo escola...



Ninguém duvida que a integração do GMail com o Google Talk trouxe uma grande praticidade aos seus usuários. Tanto que o Yahoo pretende fazer o mesmo com seu serviço de webmail, integrando o Yahoo! Mail com o Yahoo! Messenger.
Notícia da Info:

Yahoo! terá mensagem instantânea em webmail

Sexta-feira, 10 de novembro de 2006 - 13h40

Reuters

quarta-feira, novembro 08, 2006

Senado decide retirar projeto que define controle da internet


A votação do projeto do senador Eduardo Azeredo (PSDB-MG) que previa a identificação dos usuários de internet, foi retirada da pauta de votações. Será um lampejo de bom senso?

Quem iria arcar com os custos de se manter por até 3 anos os registros e logs de todos os usuários dos respectivos provedores de acesso?

Ou então, será que não houve interesses comerciais, como por exemplo dos bancos que têm que investir grandes quantias em segurança da informação?

Li em um blog (não me lembro qual nesse momento) que, de qualquer maneira, se essa lei passar pelo Senado, a Câmara deve barrá-lo.

Segue a notícia publicada na Info OnLine:

Quarta-feira, 08 de novembro de 2006 - 09h27

SÃO PAULO - O Senado decidiu retirar de sua pauta de votações a análise do projeto sobre crimes digitais. A votação do projeto na Comissão de Constituição e Justiça (CCJ) estava marcada para esta quarta-feira (8).

De acordo com a assessoria do senador Eduardo Azeredo (PSDB-MG), não há novo prazo definido para que o projeto retorne à pauta de votações da casa. Antes de ser votado pelos parlamentares, o projeto será submetido a debate público e poderá sofrer mudanças.

Entre diversos artigos que prevêem, por exemplo, punições para quem cria e dissemina vírus ou invade computadores e redes, o projeto prevê a identificação obrigatória de todos os usuários de internet no país, item que causou forte polêmica.

Após reação pública negativa, vários parlamentares pediram que a análise do projeto fosse adiada. O presidente da casa, Renan Calheiros (PMDB-AL) e o senador Antônio Carlos Magalhães (PFL-BA) pediram publicamente mais tempo para avaliar a proposta.

Na Câmara, o deputado Aldo Rebelo (PC do B-SP) disse que o Congresso apoiará o combate ao cibercrime, desde que isto não interfira nas liberdades individuais dos usuários.

O texto a ser analisado é de autoria do senador Azeredo, que é relator do projeto e autor do texto final (substitutivo) que condensa outros três projetos sobre crimes digitais que tramitaram no Congresso. Azeredo afirma que seu projeto não fere a privacidade dos usuários, mas sim moderniza e amplia o controle da internet o que, na sua opinião, é uma tendência mundial.

Para se tornar lei, o projeto deveria ser aprovado não só na CCJ, mas também em plenário, por maioria simples, em ambas as casas (Senado e Câmara). O projeto teria ainda que ser sancionado pelo presidente da República.

Felipe Zmoginski, do Plantão INFO