• Как посчитать до какого значения заполнен массив по каждому из измерений?

    Nipheris
    @Nipheris Куратор тега C#
    И этот массив заполнен некоторыми строковыми значениями, но не полностью, а только до некоторых значений.

    Это предположение неверно. Массив не бывает заполнен частично, до некоторых значений. В массиве всегда есть все значения, просто при создании массива они устанавливаются в дефолтовые.
    Вам нужно хранить ваши значения в структуре переменного размера, например в списке (List).
    Либо, раз уж у вас значения строкового типа, вы можете воспользоваться тем фактом, что строка - это ссылочный тип, и поэтому может иметь значения null. Вы можете идти по элементам массива до первого встретившегося null и считать его первым "незаполенным" элементом, если это подходит для вашей задачи (правда, тогда это придется делать каждый раз заново).
    Ответ написан
    Комментировать
  • Какую книгу лучше взять для изучение программы visual studio?

    Nipheris
    @Nipheris Куратор тега C++
    Для "изучения" вещей, таких как IDE, в которых и изучать то нечего, есть официальная документация. Официальная документация к продуктам Microsoft, имеющих отношение к разработке ПО (VS, TFS, библиотеки и прочее), находится на специальном портале, называемом Microsoft Developer Network (MSDN).
    Ответ написан
    Комментировать
  • Одна обратная косая черта в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Вторую обратную косую черту вам ставит сериализатор JSON, т.к. обратная косая черта есть спец. символ в JSON и должна быть заэкранирована. Если вам надо в САМОМ JSON такую вещь: "\/", не добавляйте обратную косую черту в путь вообще. Сериализатор JSON добавит вам её сам, когда заэкранирует ПРЯМУЮ косую черту. Т.е. отдавайте сериализатору как есть, path="Path1/Path2".
    Ответ написан
    Комментировать
  • Как правильно написать sql-запрос?

    select route.name, departure_city.name, arrival_city.name
    from
        route
        join city departure_city on route.departure_city_id = departure_city.id
        join city arrival_city on route.arrival_city_id = arrival_city.id
    Ответ написан
    Комментировать
  • Какие многопользовательские субд с последовательным доступом вы знаете?

    Читать про следующее:
    1) Изоляция транзакций
    2) MVCC
    3) Snapshot isolation

    И какую-нибудь книжку по БД. Сейчас вы ничего не понимаете в работе многопользовательской БД.
    Сайт вы нашли совершенно невероятный. Задумайтесь о поисках других источников.
    Ответ написан
    Комментировать
  • В какую сторону приведет развитие asm.js / Native Client?

    Я считаю, что развитие идет в сторону превращения браузера в целевую платформу (пусть и урезанную) общего назначения, чему должен способствовать WebAssembly, как независимый от вендора низкоуровневый стандарт. Только такой стандарт имеет шансы снять с плеч JavaScript бремя целевого языка построения веб-клиента (т.е. языка, на котором либо все разрабатывается, либо компилится в него из других языков) и положить конец этому идиотизму. Я считаю JS рано или поздно должен стать языком только разработки, и перестать быть еще и "ассемблером для веб-браузера".
    Ответ написан
    Комментировать
  • Как кратко назвать RESTful API, которое, оказывается, никакое и не RESTful, ибо возвращает JSON/XML, кодов HTTP-ошибок не использует, да и URLы не те?

    вижу какие-то статьи, где пишут, будто если с JSON, то это вообще не REST API!

    если REST API - это когда без JSON и XML (т.е. на HTML), то какое же оно тогда API?!

    Ссылки на статьи пожалуйста. Там либо автор фантазирует, либо его неправильно понимают. Единственная причина, по которой автор мог так заявить, это то, что большинство современных RESTful API не гипермедийные. Но это не значит, что не стоит в принципе использовать тот же JSON, это лишь значит, что нужно стремиться включить в него гипермедийные возможности (см. JSON-LD, HAL, Siren) и сам API также строить на этой идее, которая заключается в том, что у вас есть одна "точка входа", а на все остальные ресурсы, имеющиеся в API, вы попадаете, переходя по ссылкам внутри других возвращаемых ресурсов, точно также как вы заходите на сайт, зная его доменное имя, и дальше ходите по ссылкам.

    Однако на практике пока этим пользоваться никто не умеет, гипермедийных апи сейчас единицы. Большинство апишек подразумевает чтение документации с жестко заданными URL ресурсов, по которым нужно обращаться. Ссылки же одних ресурсов на другие используются редко.

    не использующее (или почти не использующее) HTTP-кодов ошибок

    А вот ошибками все-таки стоит пользоваться.

    какие-то паттерны URL наподобие /images/ и /images/1, про какие-то PUT и DELETE, про коды ошибок...

    RESTful API и MVC — что это?
    Основной посыл использования RESTful API - применение основной идеи Паутины для взаимодействия автоматических агентов (приложений), а не только людей.

    Основная идея Паутины - построение распределенной информационной системы путем публикации неких абстрактных ресурсов, выдачи им идентификаторов (в сегодняшнем вебе - иерархических), определения ряда простых и широко известных операций над ними, не зависящих от содержимого ресурса (те самые GET, POST, PUT и т.д.), и связывания этих ресурсов ссылками (это называется гипермедиа, и в частности, гипертекст, если речь идет о текстовой информации).

    Таким образом, если вы хотите какую-то информацию опубликовать как RESTful API, вам необходимо представить ее как набор ресурсов, а все операции над этой информацией выразить через набор предопределенных операций. Фишка в том, что во многих задачах этих предпопределенных операций вполне достаточно, главное правильно определить ресурсы.

    Также важной чертой REST является отсутствие состояния, сохраняемого между запросами к ресурсам. Это очень важно для масштабирования системы.


    Видел слово "JSON-pure API"

    Это уже вкусовщина. Люди не любят XML в API за то, что его модель подходит для описания иерархических данных и документов, но не для привычных объектно-ориентированных отношений между сущностями (он-то и создавался для представления документов, а не для веб-сервисов). Поэтому популярность JSON растет до упора. Многие старые API до сих используют XML, и JSON-pure - способ похвалиться, что ваше API полностью JSON. Сама идея RESTful ничего не говорит о форматах ответа, за исключением того, что формату желательно быть гипермедийным.
    Ответ написан
    4 комментария
  • Как создать проект на С# в MS VS 2015?

    Nipheris
    @Nipheris Куратор тега C#
    Поищите книгу, где C# изучить можно на простейших вариантах приложений, например на консольных. Windows Store возможно вам нафиг не сдался, тем более что для 10-ки это уже UWP.
    Ответ написан
    Комментировать
  • Как сделать Bind по аналогии с QtSignal?

    Nipheris
    @Nipheris Куратор тега C++
    std::placeholders
    btn->onClick = bind(&Player::play, this, std::placeholders::_1);
    Ответ написан
    1 комментарий
  • Как отрисовать большое кол-во точек с помощью WPF 3D?

    Nipheris
    @Nipheris Куратор тега C#
    1) вы так легко считаете память, выделяемую под ваши кубы). Я думаю это весьма далеко от истины, т.к. лично я даже предположить не смогу, что конкретно происходит при создании дотнетовского объекта и сколько конкретно он потребует памяти;

    2) вы используете инструмент не по назначению. WPF - это для относительно малого числа граф. объектов (десятки, сотни) с высоким уровнем интерактивности для каждого из них. Иными словами - для интерфейсов. В интерфейсах есть небольшое количество высокоинтерактивных объектов - кнопок, скроллов, комбобоксов, и именно для таких сценариев WPF и оптимизирован. Вам с 10К кубами уже давно пора брать Direct3D и не мучаться. Это я вам не с потолка говорю, мы тоже когда-то пытались использовать WPF-шную двухмерную графику для двухмерной отрисовки, но быстро поняли, что его инфраструктура слишком тяжелая для нашей задачи. Вы замучаетесь в попытках это все оптимизировать.
    Ответ написан
    Комментировать
  • Как автоматизировать сборку программ (php компонент+soap+git+cmake+vc11+ftp)?

    Nipheris
    @Nipheris Куратор тега C++
    Если прога кроссплатформенная, то https://travis-ci.org/
    Вот мануалы для плюсовщиков: https://docs.travis-ci.com/user/languages/cpp . Можно запускать CMake. Бесплатно - только open-source проекты.
    Генерируется CMake файл

    Странное желание)
    Ответ написан
  • Неявное наследование private ?!?

    Nipheris
    @Nipheris Куратор тега C++
    Вы невнимательно читали про наследование (или читали в плохом источнике).

    Логически (т.е. с точки зрения самой идеи) наследование (причем, любое, public и другие) подразумевает, что реализация базового класса станет частью реализации дочернего. Приватные поля класса - это часть его реализации.

    Технически, наследование в C++ подразумевает наличие подобъекта базового класса в объекте класса-наследника. Т.е. у вас в каждый объект Two помимо его собственных полей (в вашем примере их нет) запихиваются все поля Base (и так с каждым базовым классом, если их несколько), по принципу матрешки. НЕВАЖНО, как указали уже в первом ответе, что вы не имеете к ним доступ из класса-наследника. Важно, что они есть, и методы класса Base могут ими спокойно пользоваться, чтобы выполнять свою работу.
    Ответ написан
    Комментировать
  • Как создать круглую кнопку button со вставленным в неё SVG-изображением, на языке XAML?

    Nipheris
    @Nipheris Куратор тега C#
    1) переделайте/сконвертируйте изображение так, чтобы это был Drawing:
    <GeometryDrawing Brush="#FF8B0000">
          <GeometryDrawing.Geometry>
            <PathGeometry ....... />
          </GeometryDrawing.Geometry>
        </GeometryDrawing>

    Если PathGeometry несколько, используйте DrawingGroup.
    2) поместите полученный XAML в ресурсы;
    3) попробуйте мой велосипед для того, чтобы поместить изображение в кнопку:
    <Image Source="{Binding Source=путь_к/картинке.xaml, Converter={StaticResource ResourceUriToDrawingImageConverter}}" />

    Код конвертера:
    public class ResourceUriToDrawingImageConverter : IValueConverter
    	{
    		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    		{
    			Uri uri =
    				value is Uri ?
    					value as Uri :
    				value is string ?
    					new Uri(value as string, UriKind.RelativeOrAbsolute) :
    					null;
    
    			if (uri == null)
    			{
    				throw new Exception("Invalid URI value");
    			}
    
    			StreamResourceInfo sri = Application.GetResourceStream(uri);
    			if (sri == null)
    			{
    				throw new Exception("Resource not found");
    			}
    
    			using (Stream stream = sri.Stream)
    			{
    				var drawing = XamlReader.Load(stream) as Drawing;
    				if (drawing == null)
    				{
    					throw new Exception("Resource cannot be converted to drawing");
    				}
    
    				return new DrawingImage(drawing);
    			}
    		}
    
    		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    		{
    			throw new NotImplementedException();
    		}
    	}

    P.S. Следите за репой https://github.com/Nipheris/SharpVectors.MSBuild - там скоро появятся MSBuild-таски для конвертирования SVG прямо во время сборки проекта.
    Ответ написан
    Комментировать
  • "switch case" - плохо?

    Nipheris
    @Nipheris Куратор тега C#
    О неписанных правилах по написанию какого-либо кода нужно уточнять сначала у того, кто этот код писал или кто его поддерживает сейчас. У конкретного разработчика/команды могут быть свои неписанные правила, которые нужны лично им.
    А сам switch используется достаточно часто, чтобы не считать его злом. Уж гораздо чаще, чем goto. Тем более, switch в шарпе гораздо "безопаснее", чем в том же С++, например компилятор следит, чтобы вы поставили break, если у вас есть код после case.
    Почитайте код популярных библиотек на codeplex или гитхабе, чтобы самому все увидеть.
    Ответ написан
    Комментировать
  • Как преобразовать 1 байт и 0,5 байта в 1,5 байта(Более подробно в описании)?

    Nipheris
    @Nipheris Куратор тега C++
    Я предполагаю нужно выделить 2 байта и записать туда их как-то.

    Вам нужно считать эти два байта как единое целое (например, если вы используете потики, то считать нужно в short int), либо, если это невозможно, то тогда считать байты по отдельности и объединить их в int16_t, как советует Denis Zagayevskiy . И в том и в другом случае вам нужно понимать, что такое порядок байт в записи числа. Когда вы поймете, что такое порядок байт, то поймете, в чем суть вашего вопроса. Следить за ним нужно, т.к. в файле этот порядок байт может быть одним (и он определяется форматом файла), а на вашей машине он, в теории может быть другим, и вам нужно это понимать, когда вы будете склеивать вам int16_t. Если вы не будете его склеивать, а будете считывать сразу в int16_t, то вам нужно сверить порядок байт на вашей архитектуре и в формате файла.

    И да, числа в современной выч. технике:
    а) хранятся в двоичной системе счисления - т.е. все, что вы видите в дебаггере или в вашей программе - это целиком зависит от того, как функция преобразования числа в строку (которую вы потом видите) выбирает символы для записи числа. В большистве таких функций можно указывать систему счисления. Напишите сами такую функцию,чтобы понять, о чем речь;
    б) их размер в памяти/регистрах процессора выровнен на размер байта (как правило это 8 бит). Байт - это квант адресации и обработки данных, поэтому говорить, что число занимает 0.5 байта не вполне корректно с практической точки зрения, т.к. байт занять можно только целиком.

    Т.к. про 0.5 байт вы упомянули скорее по ошибке, я думаю битовые поля вам не нужны.
    Ответ написан
    1 комментарий
  • Какие есть Best practice доступа к БД в C#?

    Nipheris
    @Nipheris Куратор тега C#
    1) https://habrahabr.ru/company/microsoft/blog/101121/
    Команда EF разъясняет, что Code First – не совсем корректное имя, и его не совсем правильно понимают. Правильнее было бы назвать Modeling using Code. Когда мы описываем модель непосредственно в C# коде, то разработчик код лучше всего понимает. Графический интерфейс Visual Studio теперь будет работать именно с Code First, а edmx более не поддерживается.

    Ну т.е. вроде понятно, что использовать в новых проектах.
    2) используйте репозиторий: codereview.stackexchange.com/questions/57401/repos... , только прошу вас, не делайте методов, принимающих Expression и возвращающих IQueryable - такой "репозиторий" совершенно не нужен и никак ничего не абстрагирует, а только вредит. Делайте методы на каждый конкретный тип запроса, принимающие конкретные ограничения для поиска, и возвращающие IEnumerable. Такие методы реально протестировать, и вы не получите дырявую абстракцию, которая будет выдавать вам внезапно ошибки в рантайме при нестандартных запросах на выборку сущностей. И самое главное - вы не будете зависеть от конкретной ORM.
    3) не забывайте, что никуда не девался ADO.NET и другие ORM, толстые например NHibernate, и не очень. Если вы в вашем приложении делаете к базе два запроса на вставку (какой-нибудь сервис телеметрии), ни к чему городить огород с ORM. Или если у вас олдскульная база с большим количеством хранимых процедур на сервере, то толстая ORM также ни к чему (какой-нибудь биллинг например).

    Если что еще вспомню, напишу.
    Ответ написан
    3 комментария
  • Как организовать обработку сообщений от нескольких серверов?

    Nipheris
    @Nipheris Куратор тега C#
    Общая концепция и модель: раз и два.
    Конкретные реализации и протоколы: обмен сообщениями в чистом виде, независимо от платформы: AMQP, ZeroMQ; также, если речь про дотнет, можно попробовать WCF.
    Ответ написан
    4 комментария
  • Как правильно обрабатывать ошибки в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Т.е. нужна некая философия

    А какие книги вы уже пробовали читать, раз такое спрашиваете?

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

    Все это дает вам набор простых правил:
    1) выбрасывать исключение нужно тогда, когда вы не собираетесь обрабатывать возникшую ситуацию в рамках текущего алгоритма. Иными словами, для работающей в данный момент функции эта ситуация - "исключительная". Пример: вы пишете функцию для чтения GIF-файла в Bitmap, и по ходу чтения проверяете соответствие получаемых данных формату GIF-файлов (например, убеждаетесь в наличии GIF89a в начале файла). Если вдруг вы видите, что формат файла нарушен, то вам ничего не остается кроме как выбросить исключение, т.к. вы не можете продолжить выполнение основного алгоритма - считывание файла. Внутри функции считывания вы не знаете заранее, как вызывающий код захочет обработать эту проблему, вам и не нужно это знать;
    2) перехватывать исключение конкретного типа нужно тогда, когда в задачу текущего кода входит и обработка ошибок тоже. Иными словами тогда, когда исключение в вызванном коде - лишь один из вариантов нормальной работы вызывающего кода. Вернемся к примеру с GIFками: если для библиотечной функции чтения файла нарушение формата - это критическая проблема, то для вызывающего эту функцию GUI-приложения это нормальная ситуация - ее можно и нужно обработать, выдав пользователю соответствующее сообщение, или просто пропустить файл, если обрабатывается сразу несколько картинок. Или например, если вы пишете веб-сервис, вы врядли хотите, чтобы весь сервис прекратил работу из-за ошибки при обработке какого-то одного запроса. Поэтому в веб-сервере, раздающем файлы вы, к примеру, можете перехватывать все FileNotFound исключения, и выдывать ошибку 404, а на все остальные исключения внутри обработчика запроса - ошибку 500 и в обоих случаях писать в error.log.

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

    Отличный пример разных подходов - методы Parse/TryParse у числовых типов в дотнете. Первый возвращает значение и выбрасывает исключение, второй записывает значение через выходной параметр, возвращает bool и НЕ выбрасывает исключение. "Try" в названии второго метода подчеркивает, что для этого метода неудача при попытке распарсить число из строки - НОРМАЛЬНАЯ ситуация, и метод в этом случае вернет false. Для метода Parse напротив, такая ситуация будет исключительной, т.к. ему просто-напросто нечего будет возвращать, и дальнейшая нормальная работа кода, в том числе вызывающего, невозможна.
    Поэтому метода TryParse чаще используют тогда, когда вероятность ошибки высока и ее обработка - одна из ветвей алгоритма. Например при считывании пользовательского ввода мы сразу можем попросить пользователя исправить введенное значение.
    С другой стороны, Parse применяется если ошибка маловероятна, мы не готовы ее обработать и лучше прервать всю операцию целиком. Например если мы получили от сервера невалидный ответ, мы не попросим его исправить этот ответ. Дальнейшее общение с сервером лучше прервать, т.к. имеет место нарушение протокола и можно наломать дров.
    Ответ написан
    Комментировать