• Как перегрузить оператор присваивания, c#?

    Nipheris
    @Nipheris Куратор тега C#
    С точки зрения C# вы хотите не того, что нужно. В отличие от C++, где перегрузка операций даёт возможность сформировать индивидуальное поведение для каждого пользовательского типа, в C# для вас построили два основных стереотипа поведения - тип-ссылка и тип-значение - и предлагают выбрать один из них.

    Вам нужно переформулировать задачу в более общую, и понять, что вы хотите сделать на самом деле, и для чего вам понадобилось переопределение присваивания. Судя по имени класса (Person), вы явно делаете с ним что-то не то.
    Ответ написан
    3 комментария
  • Как реализовать синхронизацию локальной БД с сервером в десктопном приложении?

    Nipheris
    @Nipheris Куратор тега C#
    Попробуйте SymmetricDS, этот проект как раз посвящен синхронизации (репликации) в master-master архитектуре с учётом непостоянного соединения между узлами. Ажура вроде как поддерживается. Что ставить на кл иенте - зависит от размера и требований к базе. Скорее всего хватит SQLite.
    Ответ написан
    Комментировать
  • GIT как правильно пользоваться?

    Нужно и ли ставить git на VPS-Сервер?

    Не обязательно, зависит от того, какой вариант доступа вы выберете - через SSH, по HTTP или вообще поставите какой-нибудь Gitlab или Stash (только тут уже зависит от мощностей вашего VPS, не факт что хватит). Гуглите инструкции по установке (git over ssh, git over http), и смотрите, что вам нужно на сервере.

    Учитывает ли GIT изменения в MySql?Если кто то допустим добавит новую таблицу

    Git к реляционным СУБД прямого отношения не имеет, и непосредственно учитывать изменения в БД он не может в принципе. Git работает с файлами и файловой системой, фактически это многоверсионная файловая система поверх обычной ФС, с ветвящимся версионированием. Для ветвящегося версионирования непосредственно в БД сейчас нет распространенных решений (существует пара реализаций, но вы не захотите с ними иметь дело). Поэтому разработчики решают задачу версионирования и обновления данных и схемы с помощью специальных скриптов - "миграций", которые хранят в обычных текстовых файлах в Git. Это могут быть как обыкновенные SQL-скрипты, так и скрипты под конкретный фреймворк/библиотеку для работы с БД. При разработке проекта каждый раз когда необходимо изменить схему или начальные данные в БД, пишется миграция, которая обновляет схему или данные в БД при деплое проекта. Гуглите "PHP migrations" и обрящете.

    Нужен ли github?Или другие подобные сайты

    Вам решать. Если у вас есть VPS и вы готовы настроить там Git для совместной работы, то гитхаб вам не обязателен. Если не хотите париться, и вам проще заплатить за приватную репу - пожалуйста. Если приватность репозитория вам не нужна - можете прямо сейчас создать организацию на гитхабе и пользоваться.

    Как вообще все это организовать?

    Аспектов всяких много, задавайте конкретные вопросы. В двух словах о налаживании работы веб-студии не расскажешь.

    В интернете толком не нашел примеров использования с нуля на боевых проектах

    Использования чего? Git? А что вам осталось непонятным?

    Т.е можно какоую-нибудь пошаговую инструкцию, типа

    1. Ставите на рабочих станциях клиент Git.
    2. Настраиваете доступ к общему репозиторию на сервере.
    3. Совместная работа организуется путём выбора существующей или выработки своей методики версионирования проекта и ветвления состояния репозитория. Git Flow обычно советуют как достаточно простую и универсальную модель, с которой лучше всего начать. Как поймёте, что такое Git на самом деле, поймёте и что вам от него нужно и как это получить (и выработаете эту модель сами).
    В любом случае так или иначе всё сводится к ветвлению/слиянию веток, а как конкретно это делать - см. выше. Гит лишь предоставляет концепцию ветвления и концепцию локальных/удалённых веток, т.е. децентрализованный репозиторий.
    Ответ написан
    2 комментария
  • Как сделать инсталлятор для своего приложения linux, windows, macos?

    В никсах распространение нормального софта делается через пакетные менеждеры. Читайте про сборку пакета для пакетного менеждера, используемого в конкретной ОС, и будет вам счастье (по идее, вам это должно быть достаточно, раз вам просто файлы поставить). Например, dpkg в случае Ubuntu.

    В виндах софт устанавливается и инвентаризуется с помощью системного компонента Windows Installer. Это тоже как бы пакетный менеджер, но в отличие от никсовых системных PM, он не умеет работать с репозиториями и выкачивать пакеты - в нём этого просто не реализовано, т.к. он изначально проектировался для "коммерческого" "коробочного" ПО (под виндой исторически не было духа свободного ПО, как в линухах). Но с точки зрения установки софта он делает примерно то же самое, только с учётом виндовых заморочек - работа с реестром, права на файлы и т.д. Пакеты для Windows Installer - это MSI-файлы. Технически это простейшая readonly реляционная БД, вроде sqlite, только проще, по сути это хранилище таблиц. Существуют различные наборы инструментов для сборки таких пакетов, как коммерческие так и бесплатные. Если нужен бесплатный - берите WiX, если возможен платный - поглядите на InnoSetup InstallShield.
    Ответ написан
    2 комментария
  • Как правильно хранить ИНН в бд MySQL?

    возможно с ведущим нулём

    Но это всё равно строка

    вы сами ответили на свой вопрос.

    char(12) charset latin1

    Да, это хороший совет. Абсолютно бессмысленно и глупо использовать varchar для строк постоянной длины.

    а искать по строкам я не люблю

    А если перейти от личных предпочтений к реальным измерениям - действительно ли будут проблемы?
    Ответ написан
  • Как отрисовать векторный пузырь?

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

    Допустим, под неравномерной окружностью вы понимаете эллипс. У эллипса есть уравнение, которое определяет множество точек эллипса. С помощью этого уравнения можно определить, какая точка принадлежит эллипсу, а какая - нет (соответственно, какие точки закрашивать цветом контура, а какие - нет).

    На практике не всегда удобно проходить по всему множеству точек и проверять принадлежность каждой из них к эллипсу. Бывает, что проще перевести уравнения кривой в параметрический вид, и вычислять значения точек для некоторого набора дискретных значений параметра. Вот параметрическое уравнение эллипса:
    https://wikimedia.org/api/rest_v1/media/math/rende...
    в котором параметр t это угол между осью абсцисс и лучом, проходящим через центр координат и некоторую точку на эллипсе (при этом мы условимся, что центр эллипса совпадает с центром координат).

    Таким образом, меняя значения t с 0 до 2*PI, мы получим множество пар (x, y) - это как раз и есть те точки, которые следует закрасить.

    Попытавшись реализовать эту идею, вы вероятно, спросите - с каким шагом изменять параметр t. Это хороший вопрос и ответ на него зависит от вашей задачи и от того, насколько точно вы желаете нарисовать эллипс. Кроме того, если вы будете рисовать отдельные точки, как написано выше, то даже при относительно небольшом шаге у вас не будет получаться непрерывная линия. Уменьшая шаг параметра, вы рано или поздно добьетесь непрерывно выглядящей линии, однако это может значительно увеличить время отрисовки. В качестве простой оптимизации, можете вместо отдельных точек рисовать линии между двумя последовательными точками. Тогда, вместо эллипса вы, фактически, будете рисовать многоугольник. Однако, с увеличением числа точек (т.е. с уменьшением шага параметра t), он все более будет похож на эллипс.

    Это самое простое, с чего вы можете начать.
    Ответ написан
    3 комментария
  • Правильная ли декомпозиция базы данных?

    В целом, у вас всё достаточно просто. Я предложу вам вариант схемы, а вы сравните его со своей.
    Попытаемся рассуждать в терминах множеств - это всегда полезно при проектировании реляционных БД, т.к. отношения - это множества.

    Итак, у вас есть множество мест, доступных для бронирования. Будем считать, что БД обслуживает только ОДИН стадион. Сектор, ряд и номер места - это всё иерархические координаты места, однозначно это место определяющие. Таким образом, ключом для места является (sector, row, number).

    Далее нам нужно решить, как мы будем представлять множество ВСЕХ мест. Вы указали, что количество мест известно заранее. По идее, в этом случае нам даже не нужно хранить множество этих мест, т.к. оно определяется правилом, однако рано или поздно вы столкнётесь с тем, что правило необходимо нарушить - например, какое-то из мест в данный момент оказалось непригодным для продажи билетов (сломали стул, отвалился порог, и т.д.). Поэтому ИМХО стоит всё-таки завести отношение "Место" для хранения множества ВСЕХ имеющихся мест, как вы собственно и сделали. Т.е. мы имеем первое отношение: Seat(sector, row, number).

    Теперь мы хотим хранить множество забронированных мест. Т.к. событий на стадионе будет много, для каждого из событий мы будем иметь своё множество забронированных мест. Значит, в первичный ключ отношения "забронированное место" должен попасть первичный ключ события. Предположим, что первичный ключ события это id (т.к. других подробностей вы не указали). Остальные атрибуты отношения "забронированное место" должны ссылаться на одно из имеющихся мест, т.е. у нас должен быть внешний ключ в отношение "Место" (Seat). Итак, мы имеем второе отношение: ReservedSeat(event_id, sector, row, number). При проектировании реляционной БД очень важно четко понимать, что значит НАЛИЧИЕ или ОТСУТСТВИЕ записи в каждом из отношений. Наличие записи в отношении ReservedSeat говорит нам, что конкретное место забронировано на конкретное событие. Ни больше, ни меньше. Если некоторой записи в отношении ReservedSeat нет, значит конкретное место на конкретное событие все еще свободно.
    И да, кажется мы забыли главное - а кем место-то занято? Нам нужен еще один атрибут, внешний ключ в отношение User. Добавим его:
    ReservedSeat(event_id, sector, row, number, user_id)
    . Важно, что этот атрибут не входит в первичный ключ, т.к. разные клиенты не могут забронировать одно и то же место (т.е. место всегда бронируется кем-то одним).

    Собственно, всё. Отношение User переписываем как есть, т.к. вы не указали подробностей о том, что там хранить. Отношение Event я придумаю "с потолка", добавив туда только атрибут name помимо ключа id.

    Итого (атрибуты, входящие в первичный ключ, выделены жирным):
    User(id, name, surname);
    Seat(sector, row, number);
    Event(id, name);
    ReservedSeat(event_id, sector, row, number, user_id); внешние ключи: event_id -> Event(id), user_id -> User(id); (sector, row, number) -> Seat(sector, row, number).

    Надеюсь, процесс принятия решений описан достаточно понятно. Если остались вопросы - задавайте.
    Ответ написан
    5 комментариев
  • Какие аргументы в пользу использования транзакций в бд?

    И тут выясняется, что ребята совсем нигде(!) не используют транзакций при записи связанных данных. И внешних ключей нигде(!!) в бд не ставят.

    Либо какие-то просветленные, либо дети NoSQL-эры. Скорее всего второе.

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

    Да, должна контроллироваться на уровне приложения. Но в большинстве случаев это не повод отказываться от внешний ключей и прочих средств контроля целостности. Да, я видел, что некоторые вендоры НЕ используют ограничения целостности в релизных версиях продуктов, но это скорее исключение, чем правило. И да, самое главное - в большинстве случаев данные живут дольше, чем приложение, с ними работающее. Или - также не редкость - приложений, работающий с одной базой - несколько. Тогда вам рано или поздно захочется дополнительный уровень "доверия", т.е. контроля целостности. Вы должны понимать, что неконсистентные данные в базе - это как правило большой или очень большой гемор, т.к. после появления таких данных в базе очень непросто понять, что они там делают, и что ВАМ теперь с ними делать.
    Ограничения целостности снимают только если они заметно снижают производительность БД, её (производительности) не хватает, других способов быстро поправить ситуацию нет, и у вас на данный момент уже есть хоть какая-то уверенность, что приложение не накосячит в БД.

    А теперь последнее. Целостность данных - не единственное, и даже не главное, для чего нужны и полезны транзакции. Дмитрий Энтелис классно написал про профнепригодность: попросите своих коллег написать биллинг кому-нибудь, выкатить его в продакшн, а потом объяснить начальнику отдела и директору, почему у некоторых клиентов, купивших две услуги по 500, списалось только за одну услугу. Можете рассказать коллегам про уровни изоляции - тут кстати навалом примеров.
    Ответ написан
    2 комментария
  • Что означает эта строка?

    Nipheris
    @Nipheris Куратор тега C#
    default(T) вычисляется как дефолтовое значение для типа T.

    Given a variable t of a parameterized type T, the statement t = null is only valid if T is a reference type and t = 0 will only work for numeric value types but not for structs.The solution is to use the default keyword, which will return null for reference types and zero for numeric value types.For structs, it will return each member of the struct initialized to zero or null depending on whether they are value or reference types.
    Ответ написан
    Комментировать
  • Чем отличается вторая форма нормализации от третьей?

    Третья нормальная форма не допускает наличия транзитивных зависимостей.

    Допустим, у нас есть БД автосалона. Имеется отношение Автомобиль(СерийныйНомер, Модель, Цена). Имеется зависимость СерийныйНомер -> Модель (т.е. для каждого авто мы всегда точно знаем модель этого авто). Также, так как у нас фирменный автосалон, а не продажа подержаных авто, цена автомобиля зависит только от его модели (т.е. все новые авто одной и той же модели будут стоить одинаково, всякие комплектации в расчёт не берем). Т.е. имеется зависимость Модель -> Цена.

    Т.к. по серийному номеру мы можем определить модель, а по модели - цену, то цена также зависит от серийного номера: СерийныйНомер -> Цена. Однако эта зависимость транзитивная: цена зависит не непосредственно (!) от СерийногоНомера, а от Модели. Следовательно, это отношение не находится в третьей нормальной форме (хотя находится во второй). Для приведения отношения в 3НФ его нужно разбить на два - МодельАвтомобиля(СерийныйНомер, Модель) и ЦенаМодели(Модель, Цена).

    Следует заметить, что если бы предметная область определяла бы иные зависимости, то и рассмотренное отношение могло быть в другой НФ. Например, если бы у нас все-таки продавались подержаные автомобили, и цену на каждый из них мы бы устанавливали отдельно, то зависимости Модель -> Цена уже б не было, а была бы прямая (нетранзитивная зависимость) СерийныйНомер -> Цена, и отношение подходило под критерии третьей нормальной формы.
    Ответ написан
    Комментировать
  • В чем разница между C#, .NET, ASP.NET, WEB Forms?

    Nipheris
    @Nipheris Куратор тега C#
    C# это Java.
    .NET это CLR и различные библиотеки (какие - зависит от формы поставки .NET, например .NET Framework, Silverlight или .NET Core).
    CLR это JVM.
    CIL это байткод Джавы.
    ASP.NET MVC это Spring.
    ASP.NET Web Forms это тоже веб-фреймворк, только с другой идеологией (более старый, чем MVC).

    Что для чего нужно и что за умное словечко "платформа"?

    Непонятен контекст.
    Ответ написан
    5 комментариев
  • Как подключить свою DLL в QT?

    1. Вместо extern "C++" нужно extern "C" , иначе имя вашей функции замэнглится, и найти её по имени будет весьма непросто.
    2. Возьмите Dependency Walker, и проверьте, что ваша функция действительно корректно экспортируется из DLL.
    3. Так а в чём конкретно проблема? Какую ошибку вы получаете?
    Ответ написан
    3 комментария
  • Generic Типы и двойной UpCast?

    Nipheris
    @Nipheris Куратор тега C#
    Вы не совсем верно понимаете ковариантность в generic-интерфейсах и напутали в кучу много всего.

    Во-первых, тип поля figure ни на какой другой не меняется. Он не может измениться "на ходу", т.к. конкретный объект конкретного класса уже создан.

    Тип возвращаемого значения свойства Figure также не меняется.
    Еще раз повторюсь - у класса и у его экземпляра не меняются никакие типы ни полей, ни свойств.

    Вы почему-то воспринимаете приведение типа класса к интерфейсу как конвертацию значения объекта - как будто создастся другой Circle, у которого будут другие типы полей. Совершенно точно это не так.

    Когда речь идёт о ссылочных типах (а полиморфизм с использованием интерфейсов работает только с такими типами), то вам следует четко понимать, что вы работаете со ссылкой, и приведение типа для ссылки никак не может влиять на сам объект. Иными словами, вы просто меняете "окно", через которое смотрите на объект.

    Таким образом, ковариантность в случае интерфейсов - это вопрос исключительно типизации. Когда в C# добавили ко- и контрвариантность, фактически вам разрешили считать, что IContainer это частный случай IContainer, а раз так - то ВСЯКИЙ IContainer можно трактовать как IContainer. В ранних версиях языка этого нельзя было сделать - можно было только Container трактовать как IContainer.

    Если в ответе что-то непонятно, спрашивайте, т.к. по вашему вопросу создаётся ощущение, что у вас где-то большой пробел в понимании языка. Вы закапываетесь в детали, делая совершенно неверные предположения о происходящем.
    Ответ написан
    9 комментариев
  • Как организовать хранение библиотек и хидеров от которых зависит наш проект?

    Nipheris
    @Nipheris Куратор тега C++
    CMake решит большинство ваших проблем:

    https://cmake.org/cmake/help/v3.6/command/find_pac...
    CMake:How To Find Libraries

    Большинство - кроме проблемы установки/управления зависимыми библиотеками. Т.е. CMake попытается найти в системе нужную версию библиотеки, но установить вы её должны сами. В *nix - системах с этим неплохо справляется системный пакетный менеджер, в Винде всё плохо (т.е. делаем руками).
    Ответ написан
  • Как обработать и тестировать ошибку отсутствия обязательных аргументов конструктора при создании объекта?

    Эх, что только люди не делают, чтобы пофиксить JS.

    Лучший способ тестировать ошибку отсутствия обязательных аргументов - пользоваться TypeScript.

    Что касается вашего варианта - я бы делал строгую проверку на undefined, т.к. в качестве значения аргумента иногда вполне может передаваться null - тогда ваша проверка не будет корректно отрабатывать.
    Ответ написан
  • Чем создавать правильные .d.ts?

    1. Посмотрите вот эти тулы, они называются по-разному, но такое ощущение, что делают одно и то же, как раз то, что вы хотите:

    2. Подпишитесь на этот таск: Proposal: Bundling TS module type definitions, чтобы следить за появлением решения "из коробки". Сейчас вроде как нет его.
    Ответ написан
  • Зачем модификатор доступа у аргумента в конструкторе?

    это сокращенный синтаксис объявления поля: www.typescriptlang.org/docs/handbook/classes.html , раздел Parameter properties.
    Ответ написан
    Комментировать