Sobre macaca, macaca-de-auditório, macacal, macacão, macacar, macacarecuia, macacaria, macaco, macacoa*, macaco-adufeiro, macaco-aranha, macaco-barrigudo, macaco-cabeludo, macaco-da-meia-noite, macaco-da-noite macaco-de-bando, macaco-de-cheiro, macaco-inglês, macaco-japonês, macaco-narigudo, macaco-patrona, macaco-prego, macaco-prego-do-peito-amarelo e TI.

sábado, agosto 25, 2007

Code Contest: Em tempos de Mega Sena Acumulada

Um pequeno desafio:

Escrever em qualquer linguagem de programação um programa que realize 100.000 sorteios de um numero entre 1 e 60 e mostre na tela os 6 mais freqüentes.

Ganha quem fizer o programa com o menor numero de linhas possíveis, lembrando que a linha considerada é a linha da unidade léxica da linguagem, portanto a seguinte linha em Java seria considerada duas: int i =0; sysout(i);

Fiz com 3 linhas em Ruby:

hist = Hash.new(0)
100000.times{|e| hist[1 + rand(60)] += 1}
hist.sort{|a,b| b[1]<=>a[1]}.to_a.slice(0,6).each{|e| puts "#{e[0]} --> #{e[1]}"}


Será possível fazer em menos linhas com Python, Groovy, Haskell ou Prolog? Em Ruby da pra fazer com menos? Citei essas porque acho quase impossível fazer com menos do que isso com Java, C/C++ ou C#, mas se alguém quiser provar o contrario...

Update II

Para ficar mais organizado novas Contribuições estão sendo postadas aqui.

Update

O ZehOliveira do GUJ fez com 3 linhas na interessantísima IO (Valeu Zé!):

h := Map;

100000
repeat(if(h hasKey(n := Random value(1, 60) round asString), h atPut(n, h at(n)+1), h atPut(n, 1)))

h asList sortBy(block(f, s, f at(1) > s at(1))) slice(v, 6) foreach(k, writeln(k at(0), " --> ", k at(1)))

O Daniel Martins também fez com 3 linhas em Groovy e em SmallTalk(Value Daniel!):

def hist = [:], v
100000
.times{hist[v = 1 + Math.random() * 60 as int] = !hist[v] ? 1 : hist[v] + 1}
println hist.keySet().toList().sort{-hist[it]}[0..5].sort().join(‘,’)


| s |
s
:= ((OrderedCollection withAll: ((1 to: 100000) collect: [:each | 60 atRandom])) groupBy: [:each | each] having: [:each | true]) asSortedCollection: [:a :b | b size < style="">].
1 to: 6 do: [:each | Transcript show: ((s at: each) at: 1); cr]


E os grandes vencedores até agora são o
Walter Cruz e o Bernado Rufino Perder eles não perdem, só se inventarem a meia linha. O caras fizeram em uma inacreditável linha:

Versão em Python do Walter Cruz:

x = [item for item in sorted([(k, len(list(g))) for k, g in groupby(sorted([randrange(1,61) for item in xrange(0,100000)]))],key=itemgetter(1),reverse=True)][:6]
print(x)

Versão em Ruby do Bernado Rufino:
Array.new(100000){rand(60)+1}.inject(Hash.new(0))
{|hash, i| hash if hash[i] += 1}.invert.sort.reverse[0..6].each{|t, n| puts "#{n}
repeated #{t} times"}
Por problemas no layout( que ja passou da hora de ser revisto) tive que quebrar a linha, mas acreditem é uma só;

segunda-feira, agosto 13, 2007

IIS: Creating a cookie affinity load balancer with Apache mod_proxy and IIS


by Rodrigo Sol and Sérgio Junqueira


Apache’s mod_proxy and mod_proxy_balancer are a good choice to create a load balancer for your web application. When we needed to configure it for our IIS ASP 3.0 application we did not find any document to help us. There are many tutorials that explain how to accomplish it using JBoss or Tomcat as back end servers, but not for Microsoft IIS.

In our architecture we use one server running Apache as load balancer and three back end servers running the IIS application.

Remember: Using only one server for load balancing means that you have a single point of failure in your system. Another Apache server will be added soon to avoid this problem.

Configuration for the Apache Load Balancer Server:

1 – Download Apache 2.3

2 – Turn on the following modules in httpd.conf:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule proxy_ftp_module modules/mod_proxy_ftp.so


3 – Configure the load balancer in httpd.conf:

Order deny,allow
Allow from all

ProxyPreserveHost On
ProxyPass / balancer://mycluster/ lbmethod=byrequests stickysession=BALANCEID nofailover=ON
ProxyPassReverse / balancer://mycluster/

BalancerMember http://your-server-node1/ route=node1
BalancerMember http://your-server-node2/ route=node2

4 – Save httpd.conf and start Apache. Tip: Enable debug log mode to see relevant log events about mod_porxy_balancer.

Configuration for each IIS Application node:

1 – Open IIS Administration Console

2 – Open your website or virtual directory properties

3 – Choose HTTP Header tab

4 – Click into ADD button

5 – Type “Set-Cookie” in the Custom Header Name.

6 – Type “BALANCEID=mycluster.node1; path=/;” in the Custom Header Value

7 – Click OK. Repeat these steps for each node in your cluster. Don’t forget to change the custom header value to the corresponding node id. For node2 use “mycluster.node2”.

There is an important undocumented point. In order put cookie affinity to work it is necessary to use a dot before the node id suffix in the cookie value. If you try to create the cookie inside the ASP application using the Response.Cookie method, URLEncode will be automatically called. This will change all dots in the cookie value into the “%2E” string and will cause cookie affinity to fail. This problem does not happen in ASP.net.