четверг, 23 июня 2011 г.

Закорючки, продолжение

Предположим, что вам необходимо множества раз писать данные в сокет, при этом задача не позволяет объединить все операции записи в одну.

Perl:
send $sock, $msg1;
send $sock, $msgN;

OZ:
{send Sock Msg1}
{send Sock MsgN}

Haskell:
send sock msg1
send sock msgN

Много раз повторяется "send sock" - попробуем избавиться от дублирования.

Perl:
my $snd = sub { send $sock, @_ };
$snd->($msg1);
$snd->($msgN);
# или &$send($msgN);

OZ:
local Snd = fun {$ M} send Sock M end
{Snd Msg1}
{Snd MsgN}

Haskell:
let snd = send sock
snd msg1
snd msgN

Как видим, Perl закорючки (@#$%&) путаются под ногами.

четверг, 2 июня 2011 г.

Закорючки

В Perl 5.14 можно передавать функциям, ожидающим в качестве аргументов хеши и массивы, не только их, а и ссылки на них.

1. |----------------------------+---------------------------|
2. | Traditional syntax | Terse syntax |
3. |----------------------------+---------------------------|
4. | push @$arrayref, @stuff | push $arrayref, @stuff |
5. | unshift @$arrayref, @stuff | unshift $arrayref, @stuff |
6. | pop @$arrayref | pop $arrayref |
7. | shift @$arrayref | shift $arrayref |
8. | splice @$arrayref, 0, 2 | splice $arrayref, 0, 2 |
9. | keys %$hashref | keys $hashref |
10. | keys @$arrayref | keys $arrayref |
11. | values %$hashref | values $hashref |
12. | values @$arrayref | values $arrayref |
13. | ($k,$v) = each %$hashref | ($k,$v) = each $hashref |
14. | ($k,$v) = each @$arrayref | ($k,$v) = each $arrayref |
15. |----------------------------+---------------------------|

То есть, все идет к тому, что скоро закорючки (@#$%&) станут не нужны.
Если честно, раньше думал, что их наличии упрощает код. Меньше надо выдумывать имен и идентификаторов.
Однако, пописав на еще более высоком уровне (OZ, Haskell), понял, что иногда без них проще.

P.S.
А может просто руки болят?

среда, 23 марта 2011 г.

не-Perl

На прошлой неделе мне сразу два человека сказало (кажется даже в один день), что я пишу на Perl как не на Perl.
Забавно, но я использую обычно очень маленькое подмножество многоликого языка Perl.

P.S.
http://github.com/kni/redis-sharding/tree/v0.2
http://search.cpan.org/perldoc?IPC::MPS

понедельник, 14 марта 2011 г.

Redis Sharding

http://github.com/kni/redis-sharding/tree/v0.2

Redis Sharding is a multiplexed proxy-server, designed to work with the database divided to several servers.
It's a temporary substitution of Redis Cluster (http://redis.io) that is under development.

Redis Sharding is used for horizontal Redis database scaling (with connecting of additional servers) as long as load distribution between the cores on the multiprocessor servers (as Redis server is single-threaded, several copies of the server can be run, one for each free core).

/- Redis (node 1)
Client 1 --- /-- Redis (node 2)
Redis Sharding --- Redis (node 3)
Client 2 --- \-- Redis (node 4)
\- Redis (node 5)

Sharding is done based on the CRC32 checksum of a key or key tag ("key{key_tag}").