Pull to refresh
43
0

User

Send message
Я взял отсюда: ru.wikipedia.org/wiki/TTH
У Вас есть другие варианты?
Спасибо за ссылку, я об этом переводе не знал. Теперь посмотрел и увидел, что у меня:
1. Рисунки тоже переведены
2. Строка «Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin.» переведена не дословно, а по смыслу. Смысл у дословного перевода в Вашей ссылке прямо противоположный, чем тот который подразумевал автор статьи.

Но конечно, если бы я знал об этом переводе, то не стал бы переводить сам.
Спасибо, теперь и туда тоже добавил (раньше кармы не хватало)) )
Автор спасибо. and not or это прикольно для тех, кто понял зачем в начале поста шутка про фортран )))
Неплохо было бы такой же тест с самыми дешевыми зарубежными VPS провести.
Который под виндовс 8.
У меня он несколько раз намертво вешал четырехядерный возьмигиговый комп пока я не сообразил, что он не умеет синхронизировать одновременно в обе стороны…
Видимо руководство посчитало, что «начать заниматься физикой» захочет меньше народа, чем просто «узнать о современной физике»…
Так что с точки зрения маркетинга ход верный.
Зато этот ход спорный (мягко скажем) с точки зрения морально-этической. Примерно из той же серии, что и китайские джинсы Adibas.
Согласен, погорячился. Разница есть, но она видна не в самих функциях copy и memcpy, а при задании их аргументов.
С++
int main()
{
	std::vector<unsigned char> v1(10), v2(10);

	for (int n=0; n<v1.size(); n++)
	{
		v1[n] = n;
	}

	std::copy(&v2[0], &v2[v2.size() - 1], &v1[0]);
	memcpy(&v2[0], &v1[0], v2.size());

	return 0;
}


Ассемблер:

	std::copy(&v2[0], &v2[v2.size() - 1], &v1[0]);
01371088  mov         ebx,dword ptr [v2]  
0137108B  mov         esi,dword ptr [ebp-24h]  
0137108E  sub         esi,ebx  
01371090  lea         eax,[esi-1]  
01371093  push        eax  
01371094  push        ebx  
01371095  push        edi  
01371096  call        dword ptr ds:[13720A0h]  
	memcpy(&v2[0], &v1[0], v2.size());
0137109C  push        esi  
0137109D  push        edi  
0137109E  push        ebx  
0137109F  call        _memcpy (01371AAAh)  


Пожалуй не такой уж std::copy тормоз, подумаю еще раз над ее использованием )

Спасибо за подробный и объективный комментарий.
Попробую ответить в меру своих компетенций.

Q: Планируете ли добавить кросплатформенную систему сборки (к примеру, CMake)?
A: В принципе да, но пока нет. Объясню почему:
во-первых, моей основной средой разработки является Visual Studio, по этой причине я очень мало знаю про инструменты разработчиков под Linux и другие платформы. Я несколько раз пытался осилить make, но всякий раз ловил себя на мысли, что не понимаю: «кто и зачем это придумал и кому это нужно».
Ну правда: мне до сих пор всегда в линуксе хватало создать исполняемый файл с именем «compile» и написать в него:
#!/bin/sh
g++ ...
rm *.o *.gch ...

Но, повторюсь, когда я осознаю необходимость CMake, то постараюсь его добавить.

Q:Планируете ли использовать систему контроля версий?
A:Серьезно над этим думаю в настоящее время. Не могу определиться с репозиторием: когда-то пользовался sourceforge, в последнее время много вижу ссылок на github.
Для меня главные критерии: простой неглючный клиент для Windows и поддержка русского языка (у sourceforge с этим вроде были проблемы).

Q:Будете ли включать предупреждения компилятора?
A:Спасибо, за найденные ошибки. Буду исправлять.
Предупреждения компилятора постараюсь использовать активнее, но только в рабочих версиях. В релизах они не к чему имхо.

Q:Недопонял, что делают строки вида "#define EPOLLIN EPOLLIN". Можете пояснить?
A: Понятия не имею )))
На сколько я помню, это копипаст отсюда.

Q:Ну и придирки по стилю: избавление от «using namspace std;» и «printf»
A: От printf пожалуй избавлюсь — это наследие от самого первого исходника, который почти целиком из OpenSSL.
Насчет «using namspace std» у меня свое мнение:
я понимаю, что данная строка очень редко кем используется и видимо считается «плохим тоном». Но вот мне лично дурным кажется например такой код
std::shared_ptr<std::map<std::string, std::vector<std::string>>>

там, где вместо этого ужаса можно написать:
using namspace std;
shared_ptr<map<string, vector<string> > >

Не знаю, но по моему, правило «не пишите using namspace» придумали враги c++. Так что не вижу смысла следовать правилам, если они затрудняют жизнь.
Согласен со всеми Вашими замечаниями, кроме
А писать код в хидерах это жесть

Насколько я в курсе, библиотека boost распространяется именно в хедерах? Поправьте, если ошибаюсь.
Во-первых, разрешите Вас поблагодарить за столь подробный и в общем доброжелательный комментарий.
Теперь, несмотря на то, что мои ответы всегда притягивают только минусы, я все таки попробую прокомментировать ваш комментарий )))

1. Конструктор сервера
Вообще, у меня появилась мысль, что про это можно написать отдельную статью, но пока попробую тут описать идею.Вы пишите «конструктор создает объект». По моему, правильнее так:: «конструктор инициирует объект».
В чем отличие? В том, что инициация это задание начального состояния или, другими словами, задание начальных значений для внутренних переменных объекта. Согласны? Если нет, то поправьте меня, но я вижу роль конструкторов именно так.
Если же Вы со мной тут согласны, то дальше все логично: мой класс CServer имеет лишь одну внутреннюю переменную и весь смысл его существования — инициирование этой переменной.
Что качается вызовов виртуальных функций: опять же, следуя своему пониманию роли конструктора, у меня даже в мыслях не возникнет вызвать из конструктора не только виртуальную, но и любую другую не приватную функцию.

2. Пример с классом сокета
Честно говоря не понял — что вы им хотели сказать, на мой взгляд он лишь подтверждает правильность моего подхода: после конструктора все переменные класса должны иметь предсказуемое, валидное и желательно константное значение. В противном случае поведение класса может вызвать недоумение у сторонних разработчиков.

3. memcpy(&vTemp[0], &m_vSendBuffer[err], m_vSendBuffer.size()-err);
Я правда наверное очень плохо знаю с++ в целом и stl в частности, но убейте — не вижу здесь пересекающихся областей памяти (((
vTemp — временный локальный буфер, выделенный в функции, а m_vSendBuffer — переменная класса, память для которой выделяется в конструкторе. Как они могут пересекаться???

4. "… библиотеки лучше вашего собственного кода."
Полностью согласен с тем, что Вы пишите. Кроме пункта:
Впрочем это удел очень хороших специалистов.

Я лично убежден, что прежде чем использовать библиотеки, надо сначала научиться программировать без них. Если меня не забанят за рекордное количество минусов, то после статей про сервер на голых сокетах я планирую написать такую же серию про сервер на boost::asio. Но именно в таком порядке, а не наоборот. Уж простите…
Я тоже с помощью MinGW собирал. Процесс описан много где в интернете поэтому не стал тут на этом останавливаться.
Исходники OpenSSL я не трогал — в статье я исправляю только пример из исходников ))
Словари считают, что кроссплатформенность это «работа на нескольких платформах», а не «работа на любой платформе».
Зачем о них упоминать?
Кто-то считает, что без libevent неблокирующих сокетов не бывает, кто-то считает что без boost::asio…
Я вот считаю, что с голыми сокетами вполне можно комфортно жить.
Сервер из статьи умещается в 425 строк кода. Сколько строк будет занимать точно такой же сервер как у меня, но реализованный на ваших любимых библиотеках?
Сто раз так делал и ни разу не возникало проблем с «недоинициированностью». А если нет разницы, то зачем платить больше? (ц)
select не подходит для очень большого количества соединений…
Я select использую в винде, а в Linux epoll. В кроссплатформенном коде надо это учесть. В данной статье я счел нецелесообразным на это отвлекаться.
ОК, продолжите свою мысль:
в Windows код
int sd = accept (listen_sd, (struct sockaddr*) &sa_cli, (int *)&client_len);
в случае ошибки вернет какое значение для переменной sd?

Или что то же самое:
в Windows код
int sd = INVALID_SOCKET
вернет какое значение для переменной sd?
Надо, объясните если не затруднит
Да я вообще-то планировал сделать несколько статей, в каждой из которых постепенно добавлять куски кода, чтобы в конце концов выложить тут полноценный однопоточный кроссплатворменный сервер для высоконагруженных проектов.
Сомневаюсь, что кому-то была бы интересна взявшаяся из воздуха портянка кода из 100500 классов по 9000 строк. Любители таких развлечений ковыряют исходники nginx, а не на форумах сидят.
А вот сейчас, когда мне слили тут всю карму, как то не особенно и хочется уже продолжать.

ЗЫ. Не знаю как в винде, а в Visual Studio 2012 INVALID_SOCKET равен -1. Можете проверить, ссылка на готовый проект есть в статье.

Information

Rating
Does not participate
Location
Россия
Registered
Activity