четвер, 30 жовтня 2008 р.

Горе плагламистам, которые думают что волшебный tcp сделает за них всё

Оказывается до сих пор в заповедниках живут программисты, которые уверенны что tcp гарантирует им доставку. Хотя на самом деле tcp гарантирует немного другое: _если_ данные будут доставлены, то они будут доставлены без искажений и в том же порядке.
Возник вопрос из описания вот этого бага в ejabberd: http://www.jabber.ru/bugzilla/show_bug.cgi?id=275
В процессе обсуждения выяснилось, что некоторые уверенны что если send(2) на блокирующем сокете не вернул ошибку, значит данные гарантировано доставлены на принимающую сторону. Для проверки нарисовал вот такие две простеньких программы:
send.c:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv)
{
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(2020);
addr.sin_addr.s_addr=inet_addr("10.1.1.82");
int sock;
sock = socket(PF_INET, SOCK_STREAM, 0);
if( sock <= 0 )
{
fprintf(stderr, "socket(): %s\n", strerror(errno));
return 1;
}
if( connect(sock,(struct sockaddr *)&addr,sizeof(addr)) )
{
fprintf(stderr, "connect(): %s\n", strerror(errno));
return 1;
}
unsigned char i;
for( i=0 ; i < 255 ; i++ )
{
time_t tm = time(0);
ssize_t count = send(sock,&i,sizeof(i), 0);
printf("%d (%d): %d\n", i, tm, count);
if( count <= 0 )
{
fprintf(stderr, "send(): %s\n", strerror(errno) );
return 1;
}
sleep(1);
}
shutdown(sock,0);
close(sock);
return 0;
}


recv.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(2020);
addr.sin_addr.s_addr=inet_addr("10.1.1.82");
int sock, c_sock;
sock = socket(PF_INET, SOCK_STREAM, 0);
if( sock <= 0 )
{
fprintf(stderr, "socket(): %s\n", strerror(errno));
return 1;
}
if( bind(sock,(struct sockaddr *)&addr,sizeof(addr)) )
{
fprintf(stderr, "bind(): %s\n", strerror(errno));
return 1;
}
if( listen(sock,5) )
{
fprintf(stderr, "listend(): %s\n", strerror(errno));
return 1;
}
for(;;)
{
c_sock=accept(sock,NULL,NULL);
if( c_sock <= 0)
{
fprintf(stderr, "accept(): %s\n", strerror(errno));
}
unsigned char i;
for(;;)
{
time_t tm = time(0);
ssize_t count = recv(c_sock,&i,sizeof(i), 0);
printf("%d (%d): %d\n", i, tm, count);
if( count <= 0 )
{
fprintf(stderr, "recv(): %s\n", strerror(errno) );
return 1;
}
}
shutdown(c_sock,0);
close(c_sock);
}
return 0;
}

На одном компьютере запущен recv, потом на втором запущен send , потом через некоторое время работы на первом компьютере сделано
ipfw add deny tcp from any to any 2020

В результате recv вывел
0 (1225361963): 1
1 (1225361963): 1
2 (1225361964): 1
..
59 (1225362022): 1
и остановился в ожидании новых данных, а send вывел
0 (1225361963): 1
1 (1225361964): 1
2 (1225361965): 1
...
141 (1225362105): 1
и вывалился (очевидно получив по голове SIGPIPE)
Вот так.

P.S. для тех, кто думает что если мелкими блоками фиксированного размера слать, то и читать можно так же: http://dbg.livejournal.com/76148.html

понеділок, 27 жовтня 2008 р.

Пора в ремонт

Вчера обнаружил что у меня не работает локаут на вилке, а после попыток его включения вилка выдала наружу чуток масла... Пора таки отогнать уже велик в мастерскую, но так не хочется ...

четвер, 23 жовтня 2008 р.

А вот они, ваши пароли!

Практически все браузеры умеют сохранять введенные во всякие формочки логины с паролями. firefox не исключение. Только он пошел еще дальше - можно пойти в настройки и попросить его "а покажи ка мне пароль на вот этот сайт" Круто, правда? Я хоть и не разрешаю ему сохранять пароли на клиентбанк и т.п., но всё-таки решил от греха подальше поставить master password. Хотя конечно это вполне может быть уровня метлы, которую в некоторых сёлах до сих пор ставят к двери вместо замка чтобы показать, что хозяев нету дома - никто не обещал что в случае наличия master password пароли лежат на диске в криптографически стойком виде

середа, 22 жовтня 2008 р.

Итак, новые тормоза!

Отныне я обладатель Avid Juicy Seven . Вчера где-то до часу ночи монтировал их на велик вместо штатных Avid BB 5.
Первые положительные впечатления были еще вчера: никакой тонкой хлопотной герулировки, просто отпустил болты, зажал ручку, закрутил болты, потом еще буквально чуть-чуть подправил и всё!
Ну а продолжение уже сегодня по дороге на работу. Просто работают, без каких либо замечаний. То есть таки вещь!
Посмотрю как они в дальнейшей эксплуатации будут.

Инет магазины. Продолжение

Итак, во вторник утром так никакой дополнительной весточки от интернет магазина и не получил.
Поэтому решил попробовать еще один интернет магазин (та как вцелом остался им доволен то считаю нормальным назвать его: velo.net.ua ).
10:50 - сделал заказ
10:56 - получил письмо с просьбой уточнить какие именно роторы к тормозам мне нужны
11:19 - ответил на письмо
16:10 - приехал курьер с товаром.
По моему вот это вполне достойная оперативность. Единственный минус: не смотря на заверения на сайте что я получаю гарантию и товарный чек у курьера никаких бумажек не оказалось. На замечание по этому поводу он началь что-то нести что мол они же знают что это у них я купил эти тормоза и что если что всё будет нормально.
С первым интернет магазином, в котором я сделал заказ еще в пятницу утром, получилось еще веселее. Кстати считаю нормальным его сейчас тоже упомянуть (страна должна знать своих "героев"): bikeshop.com.ua . Они до вторника вечера так и не соизволии со мной связаться. То есть если даже я буквально чуть-чуть не дождался то доставку они сделали бы не раньше утра среды - 5 полных дней, из них 3 рабочих дня с момента заказа. Я всё-таки решил отписать им на всякий случай что тормоза я уже купил, поэтому отменяю заказ. В результате получил письмо с общей идеей "сам дурак": оказывается если заказ "горит" то надо было в примечаниях указать желаемую и критическую дату получения заказа. А то видите ли как плохо получилось: люди потратили время чтобы подготовить и обработать заявку а я взял и отменил заказ ... Интересно, а что в их понимании "не горит"? "С недельку может подождать"? Или может "до следующего сезона не критично"?

понеділок, 20 жовтня 2008 р.

Два брата близнеца

Вчера, читая в книжке по java раздел по поводу неизменяемости строк, не мог избавиться от мысли "я уже читал эту главу". Потом сообразил - буквально на прошлой неделе читал аналогичную главу в книжке по python

Инет магазины

Вот когда у нас интернет магазины начнут работать нормально, как должно быть? Чтобы просто зашел на сайт, заказал что надо, перезвонили, уточнили когда привезти, и привезли?
Я вот сходу могу только один такой случай вспомнить: это был интернет магазин по продаже духов.
А обычно заказываешь, ждешь с пару дней, звонишь по телефону, гнёшь матюков, и только после этого заказ откапывают и начинают обрабатывать.
В своё время зарекся заказывать через интернет: гораздо эффективнее на том же инет магазине найти номер телефона и заказать сразу по телефону. Но вот решил еще раз попробовать: заказал себе тормоза на велик. Заказал в пятницу утром. Сразу после заказа пришло письмо на мыло "вы заказали ...". С тех пор глухо. Ну ладно, мне сейчас не спешно, подожду еще немного
UPD: пришло мыло "здравствуйте. ваш заказбудет обработан и доставлен с понедельника. заранее спасибо" . Ну, посмотрим

Поехали

Некоторое время держал я блог у себя на сайте на worldpress. Но вот со временем как-то забил следить за его обновлениями, а спамботы задрали (потому просто отключил возможность комментирования). Потом потихоньку поюзывал ya.ru . Но вот вызывает он у меня некоторые подозрения - не хочется к нему привязываться. Да и доменное имя хочется своё.
Долго рассматривал вариант таки засетапить где-то у себя блог-движок. Но после обдумываний вопростов "где захостить" и "какой движок крутить" решил таки отказаться от этого варианта (по крайней мере пока) и попробовать предложение от гугла. А вот собственно и оно