Досрочно завершим!

Статическая версия.

Переезд сайта

Сайт переехал на новую платформу. Вопросы, предложения можно тут в комментариях.

ProblemK, Алгоритм и структуры данных

Типовой способ расчета электронной таблицы заключается в том, что в памяти строится таблица, содержащая выражения ячеек, а затем все эти ячейки рекурсивно вычисляются. То есть, если ячейка A1 ссылается на другую (скажем, C2), чтобы получить значение C2 из поцедуры вычисления A2 вызывается вычисление C2.

Несмотря на все достоинства, у такого метода есть очевидные недостатки.

Watcom vs Gcc

Для удовлетворения любопытства, скачал openwatcom 1.8 (такой бывший когда то известным компилятор c/c++), исходники под линукс. собрал, и попробовал тестовую задачку, вот эту вот

Резуьтаты:

Couchdb Benchmark II

Однако не все так плохо..

Если запустить 50 программ, каждая из которых пытается вставить по 200 записей (те же 10000 записей, что и в прошлом тесте), то вставка всех записей укладывается в 220 сек. Значит – суммарно скорость вставки при 50 процессах – 45 записей в секунду.

Кстати – база couchdb с 10000 записями (структура в предыдущем сообшении блога) занимает 54.3M.

На компьютере Intel 3.2GHz, RAM 1G, ubuntu 8.04

Couchdb Benchmark еще раз

Попробоавл тот же тест, но 10 процессов по 10000 записей. Суммарные цифры – 100_000 записей за 2308 сек. То есть 43 записи/сек. Примерно так же как и в прошлом тесте. Похоже, быстрее уде не разогнать.

Размер базы при 100000 записях – 0.6G

Couchdb Benchmark

Захотелось попробовать новую couchdb. Выглядит она хорошо, и все сделано удобно. Однако прежде чем ее использовать в каком-нибудь проекте, хотелось бы оценит ее возможности более точно.

Прежде всего посмотрим скорострельность. Для этого напишем мелкую программу на питоне, которая вставляет ну.. 10000 записей. и пусть пишет сколько секунд прошло с начала теста.

Марк Твен

“Если вам понадобится подвергнуть молодого человека тяжелому и мучительному наказанию, возьмите с него слово, что он в течение года будет вести дневник.”

Erlang & Postgresql Auth

Для прямого доступа из эрланга в postgresql (минуя odbc) есть хорошая библиотечка, написанная Martin Carlsson из Erlang Training & Consulting ltd Здесь.

У нее есть один недостаток – она рассчитана только на md5 authentication в постгресе.

Если приложение разрабатывается с нуля, то md5 auth – не представляет проблемы, как захотим, так и настроим, но в нашем случае уже есть большой и толстый postgresql сервер, со своими админами и правилами выделения учетных записей. В этом сервере метод доступа у большинства аккаунтов – password. И никак это не поправишь. В отличие от технических проблем – административные проблемы плохо поддаются решению..

Пришлось прочитать хорошенько документацию postgresql, раздел где описан протокол, и поправить erlang-овскую библиотеку. Вот, чтобы не забыть, что я там наисправлял, и
выкладываю diff

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
diff -Naur oldsrc/psql_logic.erl src/psql_logic.erl
--- oldsrc/psql_logic.erl       2006-09-18 17:46:20.000000000 +0200
+++ src/psql_logic.erl  2008-03-12 17:41:48.000000000 +0100
@@ -139,6 +139,12 @@
     AuthDigest = psql_protocol:md5digest(State#state.digest, Salt),
     psql_connection:command(State#state.connection, {send, AuthDigest}),
     {next_state, authentication, State};
+
+authentication({psql, authentication, <<0,0,0,3>>}, State) ->
+    CTPassw = psql_protocol:ctpasswd(State#state.password),
+    psql_connection:command(State#state.connection, {send, CTPassw}),
+    {next_state, authentication, State};
+
authentication({psql, authentication, <<0,0,0,0>>}, State) ->
     {next_state, setup, State};
authentication({psql, error, Error}, State) ->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--- oldsrc/psql_protocol.erl    2006-09-18 17:46:24.000000000 +0200
+++ src/psql_protocol.erl       2008-03-12 17:41:31.000000000 +0100
@@ -21,7 +21,7 @@
         to_string/1]).

 -export([authenticate/4,
-        md5digest/2,
+        md5digest/2,ctpasswd/1,
         copy_done/0,
         q/1]).

@@ -65,6 +65,9 @@
     Auth = md5([Digest, Salt]),
     {password_message, <<"md5", Auth/binary, 0:8>>}.

+ctpasswd(Passw) ->
+    PB = list_to_binary(Passw),
+    {password_message, << PB/binary,0:8 >>}.
+
copy_done() ->
     {'copy_done', []}.

Erlang Snmp Client

Вот понадобилось опрашивать некоторые железные switch через snmp из erlang. Первая попытка понять что для этого нужна (наскоком, по Буденновски) – не удалась. На erlang.org полно документации как писать и управлять snmp сервера, но вот информация по клиентам – разбросана по крупицам.