Вы извините меня, но автору задач на videosharp.info хотелось настучать по морде, когда меня попросили их решить.
Написал знакомый, с просьбой решить несколько задач на этом сайте для его дочери, у которой в школе так принимают зачеты.
Можно закрыть глаза на то, что во многих задачах описанный формат ввода-вывода не совпадает с рабочим вариантом. Можно закрыть глаза на то, что нет конкретных примеров ввода-вывода (а между прочим его дают на абсолютно всех олимпиадных задачах).
Но следующее меня убило. Дана задача:
«ЗАДАЧА
Даётся натуральное число N, от 1 до 10.
Написать программу, которая генерирует случайное число от 1 до N и выводит его на экран.
Начальные данные: одно целое число от 1 до 10.
Вывод результата: случайное число из интервала.
В программе необходимо использовать класс Random.»
Хрен пойми интервал открытый, закрытый, полуоткрытый? Ладно, пишу типа new Random().Next(1, N). Не принимает. Ок, думаю гдето вышли за интервал. Подбираю всевозможные варианты интервалов — не работает.
Провозился минут 40 и понял, что код теста — это не проверка результата на интервал, а просто захаркоженные пары чисел!!! Ну как там можно?? В итоге методом подбора сидел ломал тесты и подбирал пары чисел. Один из вариантов в итоге пришлось написать стохастически и сидеть сабмиттить решение пока рандом не вывалит нужное число.
И как после такого можно доверить обучение этому сайту?
Вы лучше шлите снепшоты) будем разбираться. Решарпер конечно более нетороплив голой студии. Но и кол-во работы, которую он выполняет (анализы, подсветки, доступность экшенов и т.д.) раз в 100 больше, чем в студии. Если ту же функциональность попробовать поднять на коде комплилятора, то все умрет на проектах в 100 раз меньших, чем у вас.
Баг в TS посмотрим, спасибо! Но скажу следующее:
как уже написал ControlFlow, мы пишем поддержки языков на языке IDE, потому что это
а) позволяет писать легко поддерживаемый и легко отлаживаемый код.
б) позволяет писать производительный код, прерываемый, асинхронный код
Компилятор TS написан на TS и слабо удовлетворяет обоим требованиям.
Во-первых, для запуска TS (точнее JS) нужно отдавать код в какой-нибудь V8 или IE, при этом теряется возможность отладки того, что происходит внутри.
Во-вторых, этот код непрерываемый «по-хорошему», только убийством фонового потока, В Решарпере все анализы прерываются на тайпинг любого символа в документе, вывод типов может запрашиваться 100-1000 раз на каждое изменение документа, и почти всегда это работает мгновенно, чего не скажешь о студии, которая вешает хайлайтинги в TS документе с задержкой около секунды.
В-третьих, когда мы имплементируем поддержку TS (как и других языков), мы руководствуемся спекой. А у компилятора TS мы выявили немалое кол-во расхождений со спекой языка (и репортили баги, конечно же). Было немало случаев, когда логику работы компилятора мы понять не смогли вообще (она не сходилась со спекой) и в разных примерах компилятор выдавал неадекватные результаты, например в отношении сравнения рекурсивных генерических типов. Даже чтение кода компилятора к прозрению не приводило.
В-четвертых, код компилятора очень нестабильный в плане API, подстраиваться под него и разбираться в изменениях, особенно, когда взаимодействие между R# и TS комилятором не строготипизированное — очень тяжелая задача, сложность которой, зависит уже не от нас.
Есть еще много пунктов, почему мы имплементим поддержку языков сами. Да, расхождения случаются, но мы стараемся их фиксить по мере поступления баг-репортов.
Один из самых полезных и прокачивающих курсов из всего, что у нас было. На первой лабе глаза вылезли на лоб, от того, что я ничего не понимаю. Но к концу курса я все же сделал jit (хотя на тот момент он не был обязательным). Правда отлично так и не получил, т.к. не успел реализовать нативные вызовы.
4.15.3 The <, >, <=, >=, ==, !=, ===, and !== operators
These operators require one operand type to be identical to or a subtype of the other operand type. The
result is always of the Boolean primitive type.
3.8.3 Subtypes and Supertypes
S is a subtype of a type T, and T is a supertype of S, if one of the following is true, where S’ denotes the
apparent type (section 3.8.1) of S:
* S and T are type parameters, and S is directly or indirectly constrained to T
>Thread receivethread = new Thread(ReceiveThread);
Просто так создавать треды — очень плохая практика.
Юзайте ThreadPool.
void ReceiveThread()
{
while (true)
{
byte[] buffer = new byte[Configuration.bufferLenght];
int read = client.Receive(buffer);
if (read > 0)
{
EventData data = Serialization.Deserializate(buffer);
if (data != null)
{
RecevieData(data);
}
}
}
}
Потенциально огромный мемори траффик.
Вижу, что юзается бинари форматтер, для целей быстрой сериализации данных — он жутко медленный. ПРоверяли.
catch (SocketException ex)
{
}
За такое, особенно в либах, бьют палкой.
Честно сказать — тихий ужас, без обид. Ну т.е. если вы это пишете просто для практики, то никому нет дела, но заявлять о новой клиент-сервер библиотеке на хабре, да еще писать по ней серию уроков — весьма странно) У вас колво текста в одном уроке больше, чем кода во всей либе) проще прочитать код.
Каким образом происходит сериализация сообщений? Насколько оно производительно?
Если это обычная xml сериализация дотнета, то уж лучше взять и юзать signal.r.
Когда мы писали взаимодействие client-server для маленькой игрушки в универе, пришлось заюзать protocol buffers, вот это было реально быстро.
Как работет авторизация и есть ли она?
Есть ли возможность создавать типизированные сервисы?
Мне для текущего проекта нужна была библиотека, которая умела бы push модель с прозрачным процессом коннекта/дисконнекта клиентов, плюс строгая типизация сервисов. Лучше Signal.R пока ничего не нашел.
см. пример из начала статьи. На строке Bar(foo) будет произведена попытка вызова foo.Bar(), которая будет успешна. Т.е. вместо функции вызовется именно метод
Написал знакомый, с просьбой решить несколько задач на этом сайте для его дочери, у которой в школе так принимают зачеты.
Можно закрыть глаза на то, что во многих задачах описанный формат ввода-вывода не совпадает с рабочим вариантом. Можно закрыть глаза на то, что нет конкретных примеров ввода-вывода (а между прочим его дают на абсолютно всех олимпиадных задачах).
Но следующее меня убило. Дана задача:
«ЗАДАЧА
Даётся натуральное число N, от 1 до 10.
Написать программу, которая генерирует случайное число от 1 до N и выводит его на экран.
Начальные данные: одно целое число от 1 до 10.
Вывод результата: случайное число из интервала.
В программе необходимо использовать класс Random.»
Хрен пойми интервал открытый, закрытый, полуоткрытый? Ладно, пишу типа new Random().Next(1, N). Не принимает. Ок, думаю гдето вышли за интервал. Подбираю всевозможные варианты интервалов — не работает.
Провозился минут 40 и понял, что код теста — это не проверка результата на интервал, а просто захаркоженные пары чисел!!! Ну как там можно?? В итоге методом подбора сидел ломал тесты и подбирал пары чисел. Один из вариантов в итоге пришлось написать стохастически и сидеть сабмиттить решение пока рандом не вывалит нужное число.
И как после такого можно доверить обучение этому сайту?
как уже написал ControlFlow, мы пишем поддержки языков на языке IDE, потому что это
а) позволяет писать легко поддерживаемый и легко отлаживаемый код.
б) позволяет писать производительный код, прерываемый, асинхронный код
Компилятор TS написан на TS и слабо удовлетворяет обоим требованиям.
Во-первых, для запуска TS (точнее JS) нужно отдавать код в какой-нибудь V8 или IE, при этом теряется возможность отладки того, что происходит внутри.
Во-вторых, этот код непрерываемый «по-хорошему», только убийством фонового потока, В Решарпере все анализы прерываются на тайпинг любого символа в документе, вывод типов может запрашиваться 100-1000 раз на каждое изменение документа, и почти всегда это работает мгновенно, чего не скажешь о студии, которая вешает хайлайтинги в TS документе с задержкой около секунды.
В-третьих, когда мы имплементируем поддержку TS (как и других языков), мы руководствуемся спекой. А у компилятора TS мы выявили немалое кол-во расхождений со спекой языка (и репортили баги, конечно же). Было немало случаев, когда логику работы компилятора мы понять не смогли вообще (она не сходилась со спекой) и в разных примерах компилятор выдавал неадекватные результаты, например в отношении сравнения рекурсивных генерических типов. Даже чтение кода компилятора к прозрению не приводило.
В-четвертых, код компилятора очень нестабильный в плане API, подстраиваться под него и разбираться в изменениях, особенно, когда взаимодействие между R# и TS комилятором не строготипизированное — очень тяжелая задача, сложность которой, зависит уже не от нас.
Есть еще много пунктов, почему мы имплементим поддержку языков сами. Да, расхождения случаются, но мы стараемся их фиксить по мере поступления баг-репортов.
These operators require one operand type to be identical to or a subtype of the other operand type. The
result is always of the Boolean primitive type.
3.8.3 Subtypes and Supertypes
S is a subtype of a type T, and T is a supertype of S, if one of the following is true, where S’ denotes the
apparent type (section 3.8.1) of S:
* S and T are type parameters, and S is directly or indirectly constrained to T
В вашем случае условие сабтайпинга не выполняется
Просто так создавать треды — очень плохая практика.
Юзайте ThreadPool.
void ReceiveThread()
Потенциально огромный мемори траффик.
Вижу, что юзается бинари форматтер, для целей быстрой сериализации данных — он жутко медленный. ПРоверяли.
За такое, особенно в либах, бьют палкой.
Честно сказать — тихий ужас, без обид. Ну т.е. если вы это пишете просто для практики, то никому нет дела, но заявлять о новой клиент-сервер библиотеке на хабре, да еще писать по ней серию уроков — весьма странно) У вас колво текста в одном уроке больше, чем кода во всей либе) проще прочитать код.
Если это обычная xml сериализация дотнета, то уж лучше взять и юзать signal.r.
Когда мы писали взаимодействие client-server для маленькой игрушки в универе, пришлось заюзать protocol buffers, вот это было реально быстро.
Как работет авторизация и есть ли она?
Есть ли возможность создавать типизированные сервисы?
Мне для текущего проекта нужна была библиотека, которая умела бы push модель с прозрачным процессом коннекта/дисконнекта клиентов, плюс строгая типизация сервисов. Лучше Signal.R пока ничего не нашел.
public static void Is(this int x, int y)
{
42.Is(1);
}
Работает без проблем