Give me your best code, baby
Интересное в программировании
вторник, 22 декабря 2015 г.
вторник, 15 декабря 2015 г.
Сингл vs Мульти
Уже почти 4 месяца прошло с момента начала разработки игры. Сервер пишется на go, клиент на C#(unity3d). С самого начала я не осознавал до конца, какой же это геморрой - пилить мультиплеерную игру :)
Лично для меня основные сложности на данный момент - разная кодовая база и слишком правильная разработка на сервере. Клиент прощает многое, можно кодить много и говнисто. На сервере это проблематично ввиду того, что клиентов уже несколько. Руки выпрямляются сами, но какой ценой...
До сих пор когда пишу код на сервере, отвечающий за спавн ботов, думаю: а на клиенте достаточно было б написать
Лично для меня основные сложности на данный момент - разная кодовая база и слишком правильная разработка на сервере. Клиент прощает многое, можно кодить много и говнисто. На сервере это проблематично ввиду того, что клиентов уже несколько. Руки выпрямляются сами, но какой ценой...
До сих пор когда пишу код на сервере, отвечающий за спавн ботов, думаю: а на клиенте достаточно было б написать
GameObject.Instantiate(botPrefab, botPos, botRotation);
среда, 3 сентября 2014 г.
Обратный порядок слов в строке
Ходил недавно по собеседованиям, наткнулся на интересную задачу. Поменять порядок слов в строке, разделенной пробелами. Например из "one two three four" сделать "four three two one" за линейное время, не используя дополнительную память. В лучших традициях, на собеседовании до решения я не догадался. Хорошая мысль пришла мне уже дома:
#include <iostream> #include <string> void main() { std::string str = "one two three four"; for (size_t i = 0; i < str.length() / 2; ++i) { std::swap(str[i], str[str.length() - i - 1]); } auto inversePartOfString = [](std::string& str, size_t low, size_t high) { for (size_t j = low, k = 0; j < (low + high) / 2; ++j, ++k) { std::swap(str[j], str[high - k - 1]); } }; int lastFound = 0; size_t i = 0; for (; i < str.length(); ++i) { if (str[i] != ' ') { continue; } inversePartOfString(str, lastFound, i); lastFound = i + 1; } inversePartOfString(str, lastFound, i); std::cout << str << std::endl; }
воскресенье, 25 марта 2012 г.
Простая задачка о произведении всех элементов в массиве
Не так давно столкнулся с простой задачей: посчитать произведение элементов в массиве. Первое решение, приходящее в голову:
namespace { template<class T> class Multiply { public: Multiply(T& result) : TotalResult(result) { } void operator()(const T& v) { TotalResult *= v; } private: T& TotalResult; }; } void main(void) { int result = 1; Multiply<int> functor(result); int buffer[] = {1, 2, 3, 4}; std::for_each(buffer, buffer + 4, functor); std::cout << "Result = " << result; }Поскольку for_each принимает последний параметр по значению, то функтору нужно передавать ссылку извне. Также, чтобы где-то сохранять ссылку на результат нам пришлось написать класс. Однако можно решить задачу и по-другому, используя std::bind1st.
понедельник, 19 марта 2012 г.
Мелочи жизни
В рабочем коде периодически натыкаюсь на код подобного вида:
class SomeClass { //.... }; typedef std::auto_ptr<SomeClass> SomeClassAutoPtr; typedef std::tr1::shared_ptr<SomeClass> SomeClassSharedPtr; //.... SomeClassAutoPtr ptr = getSomePointer();Читать подобные километровые названия не очень приятно. Решение получше:
class SomeClass { //.... typedef std::auto_ptr<SomeClass> AutoPtr; typedef std::tr1::shared_ptr<SomeClass> Ptr; }; //... SomeClass::AutoPtr ptr = getSomePointer();ИМХО второй вариант выглядит куда приятнее первого, к тому же не засоряет "глобальное пространство имен".
вторник, 22 ноября 2011 г.
SyntaxHighlighter для блога
Настроил syntaxhighlighter теперь при переключении вкладок "Создать" и "HTML" данные о подсветке не теряются + можно более менее легко править исходники
#include <iostream> void main() { //hey, look at this std::cout << "Hello World!"; }
пятница, 18 ноября 2011 г.
Особенности использования shared_ptr и RefCounter
Бредисловие
Думаю каждый программист слышал или использовал shared pointers и встречался с идиомой ref counter для разделяемых ресурсов. По отдельности их использование не представляет сложности и опасности, но что может быть если совместить их вместе?
А как все начиналось...
Предположим мы расширяем существующий функционал программы. Архитектура программы содержит в себе некий "промежуточный" слой service, который состоит из классов-менеджеров. Т.е. для записи файла на CD есть класс CdWriterManager, для записи файлов на расшаренные папки ShareWriterManager и прочие. И вот нам дают задание написать класс для записи файлов на FTP.
Думаю каждый программист слышал или использовал shared pointers и встречался с идиомой ref counter для разделяемых ресурсов. По отдельности их использование не представляет сложности и опасности, но что может быть если совместить их вместе?
А как все начиналось...
Предположим мы расширяем существующий функционал программы. Архитектура программы содержит в себе некий "промежуточный" слой service, который состоит из классов-менеджеров. Т.е. для записи файла на CD есть класс CdWriterManager, для записи файлов на расшаренные папки ShareWriterManager и прочие. И вот нам дают задание написать класс для записи файлов на FTP.
Подписаться на:
Сообщения (Atom)