Задать вопрос
  • Как правильно обрабатывать ошибки в 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 применяется если ошибка маловероятна, мы не готовы ее обработать и лучше прервать всю операцию целиком. Например если мы получили от сервера невалидный ответ, мы не попросим его исправить этот ответ. Дальнейшее общение с сервером лучше прервать, т.к. имеет место нарушение протокола и можно наломать дров.
    Ответ написан
    Комментировать
  • Что происходит с кодировкой файлов C#?

    Nipheris
    @Nipheris Куратор тега C#
    Судя по скрину, у вас для UTF-8 потерялся BOM.
    Скорее всего это произошло потому, что вы считали файл неверной кодировкой (в файле у вас UTF-8 вроде как). Используйте кодировку явно, например UTF8Encoding вместо дефолтовой.
    Ответ написан
    Комментировать
  • Как скачивать несколько файлов через WebClient по очереди? Через DownloadFileAsync?

    Nipheris
    @Nipheris Куратор тега C#
    1) сразу попробовать DownloadFileTaskAsync, с тасками работать проще;
    2) дожидаться завершения таска на скачку одного файла перед запуском следующего;
    3)
    Новый поток? Пробовал. Не двигается прогресс бар.

    Работать с контролами только из GUI-потока. Читать про SynchronizationContext.
    Ответ написан
  • Разработка десктоп клиента для БД. Чем, на чем?

    P.S. ОС у пользователей естественно windows (7,8)

    GUI - когда-то пару проектов на winform

    C#

    ну так чего думать-то. Посмотрите на WPF, на EntityFramework/NHibernate и вперед. Ну или если есть возможность и время, разбейте на веб-сервис (можно написать на чем угодно) и веб-клиент (собсно, ваше десктопное приложение).
    Ответ написан
    2 комментария
  • Как на лету добавлять столбцы в базу данных?

    Nipheris
    @Nipheris Куратор тега C#
    C SQL базой правильно такого не делать. В смысле - не изменять схему SQL базы данных по запросам пользователя. Нужно подумать, почему возникает такая необходимость, возможно часть данных нужно хранить в документно-ориентированной БД.
    Ответ написан
    Комментировать
  • Какие есть крупные open-source проекты на PHP?

    Ой, а можно мне вспомнить беззаботные юношеские времена?
    Ответ написан
    Комментировать
  • Какие знания нужно иметь в C++ для перехода на приложения с GUI?

    Nipheris
    @Nipheris Куратор тега C++
    Нужны знания о том, как правильно пользоваться сторонними библиотеками (любыми), написанными на C/C++ - как их подключать в проект и как работать с их API так, чтобы не наломать дров. Для этого необходимо понимать управление памятью в C++, понимать что такое жизненный цикл объекта и еще некоторые мелочи (например, что не стоит выделять память в одном двоичном модуле, а высвобождать в другом).
    Ответ написан
    1 комментарий
  • Что написать на C++ для тренировки?

    Nipheris
    @Nipheris Куратор тега C++
    P.S.: убедительная просьба не предлагать написать консольные калькулятор, конвертер и прочую мелочь.


    Напишите не консольный, а с рисованием графиков. Да и к совету Александр Таратин насчет производной советую прислушаться. А если для вас это мелочь, найдите производную не численным, а символьным путем (как делает Maple, например). Много интересного ждет вас.
    Ответ написан
    Комментировать
  • Как работает mongodb?

    При запросе к коллекции сервер mongodb уже работает или запускается призапуске сервера nodejs например.

    Кажется, вы не работали не только с nosql, а вообще с любыми многопользовательскими СУБД. Монга это не SQLite: запускается демон и слушает порт на подключения по сети.

    И mongodb устанавливается в сис. файлы?

    Вообще вопрос не понял. Что для вас "системные файлы"?

    Если установить в директорию с проектом или это не играет роли куда и как установилась mongodb.

    Я думаю, в директорию с проектом не стоит устанавливать.

    Если же в любом, то как можно указать папку с коллекциями, через mongod?

    Ну вроде бы да, в любой нормальной клиент-серверной СУБД директория к данным настраивается.

    Вообщем, почитайте отсюда что-ли https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B8%D... , вам нужно понять, что монга со своими данными живет сама по себе, а ваше приложение - само по себе, и взаимодействуют они с помощью TCP. Следовательно, нет никакого смысла как-либо связывать директорию с проектом и директорию с БД Монги, т.к. они могут находиться на совершенно разных машинах.
    Ответ написан
    Комментировать
  • OpenGl камера нужна помощь?

    Nipheris
    @Nipheris Куратор тега C++
    Во-первых, условимся, что в рамках вопроса не делаем различий между OpenGL и DirectX. Будем называть их "графическим API".
    Во-вторых, будем считать это графическое API низкоуровневым (т.е. таким, как OpenGL и DirectX). Графические движки, где есть понятие сцены и камеры не рассматриваем в принципе.

    Итак, с математикой вам все равно придется разбираться по книгам (ищите об операциях над матрицами и векторами), поэтому попробую подсказать с концептуальной точки зрения.
    Самая главная истина, которую вам сейчас нужно понять:

    Для графического API НИКАКОЙ КАМЕРЫ НЕ СУЩЕСТВУЕТ.

    Для графического API существуют только примитивы (треугольники, линии, точки), которые вы хотите нарисовать, состоящие из вершин с трехмерными координатами и набор математических преобразований, которые вы хотите выполнить над этими вершинами ПЕРЕД тем, как они начнут реально рисоваться на экране (т.е. перед их растеризацией). ВСЁ. Все, что для вас выглядит как движение/поворот объекта в игровом мире ("мировые преобразования"), и движение/поворот камеры ("видовые преобразования") - лишь результат того, что вектора, задающие вершины объекта (например, кубика) предварительно умножаются на нужную, рассчитанную вами матрицу.

    Лет 10-15 назад такая матрица отдавалась непосредственно графическому API через специальные вызовы (когда видяхи уже умели делать T&L https://en.wikipedia.org/wiki/GeForce_256 , но еще не умели шейдеры), сегодня умножение вектора на матрицу - всего лишь одно из множества различных преобразований, которые можно выполнить в векторном шейдере.

    Теперь читайте про то, как эти матрицы используются и рассчитываются. Когда поймете матчасть, гляньте библиотеку GLM (раз уж у вас указано C++ и OpenGL) - она поможет не делать вам рутинную работу.
    Ответ написан
    Комментировать
  • TCP/IP работает сверху вниз или снизу вверх?

    1) прикладной уровень (HTTP) использует TCP как сервис (а именно - какое-либо API, предоставляемое ОС, например сокеты Беркли) и выражает желание отправить некоторое количество данных в пункт Б; в теории объем данных может быть любым, т.к. задача именно TCP - разбить данные на куски и прилепить к ним свой заголовок. Полученные куски с заголовками называются TCP-сегментами; в этих заголовках есть все, что необходимо для обеспечения всех гарантий, которые даёт TCP, а именно: а) номер пакета для получения пакетов в порядке их отправления и возможности сборки отправленных данных; б) целостность пакетов и отсутствие в них ошибок; в) номера портов получателя и отправителя (чтобы несколько программ на одной машине могли обмениваться данными); г) флажки для обслуживания TCP-соединения. Вся суть TCP сводится к предоставлению вам, т.е. прикладному уровню, некоего надежного виртуального "провода", которым вы как бы подключили одну программу на одной машине к другой программе на другой машине. В терминах типов коммутации, TCP поверх IP - это коммутация каналов поверх коммутации пакетов.
    2) После сборки каждого сегмента TCP использует уровень IP как сервис, и отдает ему сегменты для упаковки в пакеты. Уровень IP нужен для предоставления возможности закинуть (т.е. маршутизировать) любой пакет с текущего узла на любой другой в сети. IP не предоставляет никаких гарантий о порядке прихода пакетов на узел, и даже о том, что они вообще придут (IPv6 также не проверяет целостность пакета), однако с его помощью сетевое оборудование в состоянии выбирать различные (!) пути для доставки пакетов получателю и осуществлять эту доставку. В заголовке IP-пакета, как на письме, указан узел-отправитель и узел-получатель.
    После сборки пакета оный отправляется на канальный уровень для доставки по конкретной физической среде.

    Теперь представим, если бы этих уровней (TCP/IP) не было. Самое простое, работающее по такой схеме, что приходит на ум - передача данных по COM-порту между двумя машинами. В такой схеме вы, вероятно, получали бы данные в порядке их отправления и возможно даже имели бы контроль ошибок, НО:
    а) только одно приложение могло бы передавать/получать данные, т.к. нет виртуальных соединений (нет мультиплексирования);
    б) для передачи данных машины нужно соединять физически. Ну или сажать тётеньку, которая бы перетыкала провода, как на первых телефонных станциях с ручной коммутацией каналов.
    IP избавляет вас от пункта б), TCP - от пункта а) и тех доп. проблем, которые добавляет IP своим присутствием.
    Ответ написан
    Комментировать
  • Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?

    Nipheris
    @Nipheris Куратор тега C#
    <TreeView ItemsSource="{Binding СвойствоОбщейВьюМоделиСодержащееКоллекциюЗаписей}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding СвойствоОбъектаСсылающеесяНаОбъектРодитель}" DataType="{x:Type local:КлассОбъекта}">
                <TreeViewItem Header="{Binding СвойствоВОбъектеСТекстомДляОтображенияВУзле}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

    Не забудьте добавить описание неймспейса local.
    Ответ написан
  • Причина бесконечного вывода несвязанных символов?

    Nipheris
    @Nipheris Куратор тега C++
    У вас полнейший ад в плане работы с памятью. Вообще непонятно зачем эта свистопляска с указателем на string и массивом, непонятно даже что вы хотите вернуть из функции поиска - указатель на string или на массив string. Так или иначе, и то и другое - локальные переменные, и пытаться работать с указателями на них после завершения работы функции - грубая ошибка (точнее, ошибка пытаться возвращать указатель на локальную переменную из фукнции и думать, что это будет работать).
    Укажите, что вы хотите сделать, т.к. сложно даже понять решаемую задачу (видимо, что-то где-то найти?).
    Ответ написан
    Комментировать
  • Какую выбрать среду для написания кода на С++?

    Nipheris
    @Nipheris Куратор тега C++
    > почему там все так заморочено?
    Вы бы говорили с точностью до наоборот, имея проект с около 10к файлов исходного кода, а в солюшене 70 проектов. Вы бы говорили "Спасибо, VS, хоть как-то помогла разобрать это все". Это проф. инструмент, к сожалению он не позиционирован для обучения. Это факт.

    Для обучения берите удобный редактор (Sublime?) и вызывайте компилятор руками (из ком. строки). Много чего поймете полезного (придется, иначе не получится ничего). Как include-директории передавать и всякое такое. Как задолбаетесь это делать - напишите sh-ник/bat-ник. А вот только потом вы и поймете, зачем вам Студия, и что она может/не может облегчить.
    Ответ написан
    9 комментариев
  • Версии F# обратно совместимы?

    Любой нормальный поддерживаемый язык сохраняет совместимость на уровне синтаксиса, если не указано иного. Лично я нигде не встречал, что в F# была поломана обратная совместимость, поэтому предположу, что все в порядке. Тем более там изменений было не так уж много, кардинальных не было вообще.

    и почему здесь нет тега F# или F SHARP?

    очевидно, не популярны вопросы по F#. Тут и по C# спрашивают не так часто, как можно подумать.
    Ответ написан
    Комментировать
  • Какими способами/приемами вы пользовались чтобы получить свой первый заказ на фриланс бирже?

    Я вот просто дождался заказа, который кроме меня никто за полдня (!) не забидил. Сутью работы было написание плагина для VS для подсветки синтаксиса доморощенного скриптового языка. Результатом заказчик был доволен, сказал что при появлении средств закажет для того же языка intellisense и поиск ссылок на переменные.

    neatsoft и Пума Тайланд правильно говорят - исполнителей много только на "поточные" заказы - всякие натягивания верстки на Вордпресс и прочие дела. Разработчики ленивые, не хотят без острой необходимости в чем-то разбираться для выполнения задачи. Дело не только в тех специалистах, у которых 10 лет опыта, из которых 5 - фриланс, а еще в тех, которые выбрали в качестве своей специализации что-то другое, помимо того же веба. Даже обыкновенные десктопные приложения уже некому писать - будет либо конкретно дорого, либо по-дилетантски.

    И да, пишите первыми нормальные заявки. Автобидеров сейчас довольно много, многие заказчики даже ставят "защиту" в описании заказа, чтобы видеть, что описание прочитано живым человеком.
    Ответ написан
    Комментировать
  • Как правильно спроектировать службу?

    Во-первых вам нужно ОЧЕНЬ ЧЕТКО понять принципиальную разницу между терминами "WCF service" и "windows service", т.к. общего между ними немного. Первое это про веб-сервисы, второе - это тоже что и демоны в *nix-системах. Первое это про архитектуру распределенной системы, второе это про жизненный цикл программы (как, когда и кем запускается/останавливается).

    Поэтому:
    1) если разработка под Винду, и
    "служба должна выполнять в фоне некоторые действия с бд"

    то почитайте про Windows Service - на шарпе такие пишутся относительно просто. Это не единственный способ запустить процесс, который будет крутиться и сам что-то делать в базе, но он предпочтителен.
    2) если взаимодействие с клиентом подразумевается не по самодельному протоколу, а например по HTTP, то вам срочно нужно ознакомиться с тем, что такое веб-сервисы/веб-API и какие они бывают. Если вы уже понимаете что это такое, то вам нужно выбрать способ реализации под Дотнетом.

    Подскажите, это можно сделать в рамках одной службы или нет?

    Если под службой понимается Windows-служба, то можно. Стоит ли - другой вопрос, зависит от тех действий, которые вы хотите выполнять в фоне, архитектуры БД и политики работы с ней.
    Ответ написан
    Комментировать
  • Почему так работает Stopwatch?

    Nipheris
    @Nipheris Куратор тега C#
    Вы что, шутите так время вычисления засекать?) Вы же не на Электронике считаете, несколько итераций/рекурсивных вызовов выполнятся настолько быстро, что вы даже не заметите. Михаил пожалуй назвал вероятную причину такого поведения, но это не отменяет того, что вы плохо ставите эксперимент.

    При замере производительности одни и те же вычисления нужно проводить много раз, например по 100 тысяч раз на каждый вариант, а то и по миллиону. Тогда вы получите более-менее внятный результат для сравнения, и не будете натыкаться на всякие тонкости работы CLR.
    Ответ написан
    Комментировать
  • Чем отличается архитектура приложения от его алгоритмов?

    Архитектура - это про то, из каких элементов ("черных ящиков") собирается система/подсистема.
    Алгоритмы - это про то, как наиболее низкоуровневые элементы ("черные ящики") и выполняемые ими функции реализованы с помощью последовательности действий.

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

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

    Точное определение алгоритма можно найти в других источниках.
    Ответ написан
    Комментировать