Спасибо за ссылку, я об этом переводе не знал. Теперь посмотрел и увидел, что у меня:
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.» переведена не дословно, а по смыслу. Смысл у дословного перевода в Вашей ссылке прямо противоположный, чем тот который подразумевал автор статьи.
Но конечно, если бы я знал об этом переводе, то не стал бы переводить сам.
Который под виндовс 8.
У меня он несколько раз намертво вешал четырехядерный возьмигиговый комп пока я не сообразил, что он не умеет синхронизировать одновременно в обе стороны…
Видимо руководство посчитало, что «начать заниматься физикой» захочет меньше народа, чем просто «узнать о современной физике»…
Так что с точки зрения маркетинга ход верный.
Зато этот ход спорный (мягко скажем) с точки зрения морально-этической. Примерно из той же серии, что и китайские джинсы Adibas.
Спасибо за подробный и объективный комментарий.
Попробую ответить в меру своих компетенций.
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» у меня свое мнение:
я понимаю, что данная строка очень редко кем используется и видимо считается «плохим тоном». Но вот мне лично дурным кажется например такой код
Во-первых, разрешите Вас поблагодарить за столь подробный и в общем доброжелательный комментарий.
Теперь, несмотря на то, что мои ответы всегда притягивают только минусы, я все таки попробую прокомментировать ваш комментарий )))
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. Можете проверить, ссылка на готовый проект есть в статье.
У Вас есть другие варианты?
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.» переведена не дословно, а по смыслу. Смысл у дословного перевода в Вашей ссылке прямо противоположный, чем тот который подразумевал автор статьи.
Но конечно, если бы я знал об этом переводе, то не стал бы переводить сам.
У меня он несколько раз намертво вешал четырехядерный возьмигиговый комп пока я не сообразил, что он не умеет синхронизировать одновременно в обе стороны…
Так что с точки зрения маркетинга ход верный.
Зато этот ход спорный (мягко скажем) с точки зрения морально-этической. Примерно из той же серии, что и китайские джинсы Adibas.
С++
Ассемблер:
Пожалуй не такой уж std::copy тормоз, подумаю еще раз над ее использованием )
Попробую ответить в меру своих компетенций.
Q: Планируете ли добавить кросплатформенную систему сборки (к примеру, CMake)?
A: В принципе да, но пока нет. Объясню почему:
во-первых, моей основной средой разработки является Visual Studio, по этой причине я очень мало знаю про инструменты разработчиков под Linux и другие платформы. Я несколько раз пытался осилить make, но всякий раз ловил себя на мысли, что не понимаю: «кто и зачем это придумал и кому это нужно».
Ну правда: мне до сих пор всегда в линуксе хватало создать исполняемый файл с именем «compile» и написать в него:
Но, повторюсь, когда я осознаю необходимость 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» у меня свое мнение:
я понимаю, что данная строка очень редко кем используется и видимо считается «плохим тоном». Но вот мне лично дурным кажется например такой код
там, где вместо этого ужаса можно написать:
Не знаю, но по моему, правило «не пишите 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. Но именно в таком порядке, а не наоборот. Уж простите…
Исходники OpenSSL я не трогал — в статье я исправляю только пример из исходников ))
Кто-то считает, что без libevent неблокирующих сокетов не бывает, кто-то считает что без boost::asio…
Я вот считаю, что с голыми сокетами вполне можно комфортно жить.
Сервер из статьи умещается в 425 строк кода. Сколько строк будет занимать точно такой же сервер как у меня, но реализованный на ваших любимых библиотеках?
Я 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. Можете проверить, ссылка на готовый проект есть в статье.