• ASP.NET MVC 5 - Почему автоматически выходит из аккаунта?

    FirstX
    @FirstX
    .net developer
    Давно уже с asp.net не работал, но возможно стоит посмотреть тогда в сторону сохранения сессий в БД, либо на уровне самого сервера, если перезапускается конкретно только твой процесс сайта.

    https://msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx
    Ответ написан
    1 комментарий
  • Зачем нужны Dependency containers?

    FirstX
    @FirstX
    .net developer
    Для того, чтобы отделить мух от котлет.

    Представь, что у тебя условно есть 3 отдела. И все они между собой очень тесно связаны. Ну не могут работать друг без друга и все тут. В итоге захотел поменять что-то во втором отделе, будь добр поменяй и в остальных двух, ибо они от него напрямую зависят.

    Первое, что приходит в голову - создание абстрактных интерфейсов, через которые все взаимодействие и происходит. Ок, создали. Но абстрактные интерфейсы делать ничего не могут, на то они абстрактные. Значит где-то нужно явно создавать реализацию для этой абстракции. Становится вопрос где это делать. Создавать внутри одного класса - экземпляры другого, это уже тоже сильная связанность между ними. Для этого и придумали ящик, где будут храниться все соответствия между интерфейсами и реализациями. Захотел получить реализацию такого-то интерфейса, попросил ответственного менеджера, он сам заглянул в свой ящик и вытащил то, что тебе требуется. И назвали это все Контейнер Зависимостей (Dependency Container). То есть это конкретный инструмент для создания слабых связей между модулями.

    Ну а слабая связанность модулей и абстракции между ними дают всякие полезные фишки по типу быстрого переключения между реализациями (например реальное/тестовое окружение), позволяет проще рефакторить отдельные модули и так далее.
    Ответ написан
    Комментировать
  • Какая разница между OWINContext.Get() и его обобщенным методом?

    FirstX
    @FirstX
    .net developer
    1. habrahabr.ru/post/227351 - пункт 3, создается кастомный менеджер и явно тип не указывается. Предполагаю, что и в твоем примере - если убрать скобки с типом менеджера, ничего криминального не случится.

    2. Видимо потому, что во втором случае стоит более строгое ограничение по сигнатуре метода, чем у просто Get. А там возможно требуется использование и вызовы методов, которые определены в родительском для всех менеджеров классе UserManager. И соответственно в сигнатуре метода GetUserManager<T> стоит ограничение where <T> : UserManager.

    Скажу честно, в исходниках я не смотрел как на самом деле, но уверен на 90%, что +/- это так
    Ответ написан
    Комментировать
  • Почему метод GetEnumerator() интерфейса IEnumerable реализовывается дважды?

    FirstX
    @FirstX
    .net developer
    Для ответа на этот вопрос надо окунуться в историю. А именно был момент, когда не было Generic-типизации и был только нетипизированный интерфейс перечисления IEnumerable. А потом с приходом новой версии .Net появились обобщения (это когда явно указывается тип <T>, в твоем случае тип данных <Product>).

    Сигнатура этого интерфейса выглядит следующим образом:
    public interface IEnumerable<out T> : IEnumerable

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

    Для понимания: в старом варианте, когда ты обходил в цикле каждый элемент через foreach - тип элемента был object (все другие типы от него унаследованы). И на каждой итерации, чтобы получить свой тип Product и работать с ним - приходилось делать приведение типов.
    В новом варианте, благодаря тому, что явно указан тип <Product> при обходе в цикле - ты сразу получаешь объект типа Product.

    Рекомендую по этой теме почитать вообще изменения в .Net при переходах с версии на версию + почитать про Generic в дотнете.
    Ответ написан
    Комментировать
  • Клиент много задает вопросов, как быть?

    FirstX
    @FirstX
    .net developer
    Если клиент потенциально принесет заметную прибыль или уже приносил, то ничего лучше, чем отвечать на вопросы вы не найдете.

    Если клиент только тратит ваше или время тех.поддержки, то есть он потребляет больше, чем приносит, то нужно создавать альтернативные каналы информации, которые позволяют вам тратить меньше времени. Например, попросить ознакомиться с ответами на вопросы на сайте. Если конечно вы предусмотрительно такой раздел наполнили нужными ответами :) в книгах по маркетингу можно почитать подробнее об этом численном показателе.
    Ответ написан
    Комментировать
  • Какую из столиц (Москва или Питер) выбрать для переезда?

    FirstX
    @FirstX
    .net developer
    Сам относительно недавно переехал из Приморья в Петербург, правда я дотнетчик.
    И если честно, даже сложно сказать улучшилось ли что-то или нет) Выбор магазинов стал больше, а толку особо не прибавило, все равно пользуешься проверенным перечнем. Мест для посещений больше, но времени на дорогу тратится больше и не до каждого так просто добраться. Получается некий эффект масштабирования, но принципиально это та же самая страна, со всеми болячками и проблемами. Грубо говоря, умножь на N то, что есть сейчас и получишь примерно результат. Санкции ввели - цены на продукты растут так же, потому что все привозное практически.

    Климат думал примерно такой же как и у нас, но оказалось все несколько хуже. Все 4 выходных, как и вся оставшаяся неделя были затянуты тучами, лил дождь, на улице постоянно из-за этого лужи и грязь. Потом день солнце и опять тоже самое - сырость, грязь и серое мрачное небо. Читал, что из-за этого очень много дыхательно-легочных проблем появляется (особенно для ребенка). Кстати когда я только приехал, мне казалось, что все несколько преувеличенно, потому что каждый день стояло солнце и жара. Но наступила осень и все встало на свои Питерские места)

    Лично я не уверен, что хочу прожить здесь всю жизнь. Хотя и от Москвы я конечно восторга не испытал, но думаю, что через N лет попробую и там пожить-поработать.
    Ответ написан
    1 комментарий
  • Как Вы понимаете junior, middle (developer), senior и есть ли принципиальная разница этих понятий в вебе, эмбедде, геймдеве и других программиннгах?

    FirstX
    @FirstX
    .net developer
    Эти понятия, как и многое другое, пришло с запада. В России, знаю на примере текущей компании, есть разделение на "Инженер-программист 3й категории", 2й категории и высшей категории (ведущий инженер-программист). В нормативных документах, в том числе и в рамках должностной инструкции описано, что например инженер программист 2й категории - это сотрудник с высшим образованием по специальности и таким-то количеством лет опыта. Это формальный подход, на практике мне дали 2ю категорию существенно раньше, чем "положено".

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

    Может ли использоваться с целью занижения зарплаты? Может. Мое мнение, что в данном вопросе важно не "звание", а то как твой опыт и твои навыки покрывают запросы чужого бизнеса. Отсюда и вытекает твоя стоимость на рынке. И где-то будучи джуниором можно получать больше, чем мидл в другом месте, зависит от предъявляемых требований. Хочет ли работодатель купить дешевле тот же скилл? Хочет. Есть компании, где критерии формализованы, в рамках этой компании рост более прозрачен.

    Можно ли ответить быстро на этот вопрос? Можно. Все зависит от человека и по какой шкале он себя будет оценивать. Есть те, кто пытаются поднять свой статус, есть те, кто наоборот предпочитает предъявлять к себе повышенные требования. А есть средняя температура по больнице. Все-таки колоссального разброса в представлениях работодателей нет, поэтому есть от чего отталкиваться.

    Это все лично мое мнение, не претендующее на истину)
    Ответ написан
    Комментировать
  • С++ - как решить задачку про "Болты и Гайки"?

    FirstX
    @FirstX
    .net developer
    Самое интересное, я Вам изначально писал про сложность и даже давал ответ) Смотрите сами: получение пар - сложность квадратичная, потом сортировка вставками (если тот код использовали, что я вам давал) - тоже квадратичная сортировка. Итого 2 * n^2, но 2ка это константа, а при верхней оценке константы не учитываются, поэтому сложность всего алгоритма тоже квадратичная получается.
    Ответ написан
    2 комментария
  • С++ - как решить задачку про "Болты и Гайки"?

    FirstX
    @FirstX
    .net developer
    Код не смотрел, но если правильно понял условие, то нужно обойти в цикле каждый болт и посчитать, сколько для каждого болта есть гаек, у которых размер меньше.

    Описываю случай, когда подразумевается, что все размеры уникальны. Для не уникальных придется идею чуть модифицировать.

    Например болты А = { 2, 3, 7, 5, 4 } и гайки B = { 3, 7, 2, 4, 5 }

    Берем первый болт А0 = 2. Сравнивая с гайками, получаем, что гаек, которых меньше, чем А0 ноль. Это и будет позиция (нулевая) А0 в отсортированном массиве. Тут же кстати можно найти при обходе и тот случай, где они равны (B2) - и B2 ставим тоже в нулевую позицию. (Если можно использовать доп. массив то просто формируем вставляя данные в нужные позиции, если нет - то меняем местами элементы в существующем)

    Берем второй болт A1 = 3. Кол-во меньших гаек - 1. Значит A1 так и остается в A1. Попутно нашли B0, которым ставим в позицию B1.

    Третий болт A2 = 7. Кол-во меньших гаек - 4. Значит A2 ставим в A4. Находим равную гайку - B1 и ставим ее тоже с индексом 4, то есть в B4. И так далее до конца. Получаем 2 отсортированных массива по возрастанию.

    Правда получается, что сложность квадратичная, будет время постараюсь подумать над этим. Если что-то не так понял из условия, то уточните как раз.
    Ответ написан
    5 комментариев
  • C# - как организовать множественное наследование?

    FirstX
    @FirstX
    .net developer
    Задача конечно жесть, действительно очень сложно понять конечную цель ваших манипуляций (а мотивацию для чего вы это делаете). Но немного теории на счет того, что тут происходит.

    Есть AutoCommon и есть ряд наследников У AutoCommon есть свойство DSV, и у AutoA мы снова видим определение свойства DSV. В этот момент, компилятор неявно считает, что это абсолютно новое свойство, никак не связанное с родительским (каждый остается при своем свойстве). То есть то, что написано у вас на самом деле выглядит так

    public class autoA : autoCommon{
    	public autoA(){
    		this.dvs = new dvsDizel();
    	}
         public new dvsDizel dvs {get;set;}
    
    }


    Теперь идем в конструктор и понимаем, что объект создается только для DSV, который объявлен в дочернем классе. В родительском он как был пустой, таким и остается, о нем мы ничего не говорили.

    Теперь когда мы делаем так:

    AutoCommon auto = new AutoA();
    WriteLine(auto.dsv.a);

    Что мы видим? Правильно, ничего. Почему? Да потому что мы пытаемся обратиться к свойству, которое принадлежит родительскому классу, а мы его и не создавали никогда (точнее экземпляр объекта для свойства), мы создавали свойство дочернего объекта.

    Перепишем пример так:

    public class autoA : autoCommon{
    	public autoA(){
    		base.dvs = new dvsDizel();
    	}
         public new dvsDizel dvs {get;set;}
    
    }


    Теперь мы создаем экземпляр объекта не для дочернего объекта, а именно для родителя.
    После этого пример выше, выведет нам то, что вы видимо хотели, то есть строку с текстом.
    НО при таком вызове:

    AutoA auto = new AutoA();
    WriteLine(auto.dsv.a);

    Вы опять получите эксепшен с null. Почему ? Да потому что вы обращаетесь к свойству уже дочернего объекта, которое в этот раз мы оставили пустым)

    Итого: вы имете 2 свойства в дочернем объекте (родительское и "свое") с одинаковым именем. Чтобы обратиться к родительскому используете base.* , чтобы обратиться к своему можно явно через this.*, либо this можно опустить.

    public class autoA : autoCommon{
    	public autoA(){
    		base.dvs = new dvsDizel();
                   this.dvs = base.dsv;
    	}
         public new dvsDizel dvs {get;set;}
    
    }


    В данном варианте они теперь ссылаются на один и тот же объект, но обращаясь по родительскому типу данных вы сможете получать общие методы dsv, а если сделаете приведение типов к конкретному классу AutoA, то сможете вызывать методы DvsDizel.
    Ответ написан
    9 комментариев
  • Как работает Timer в WPF?

    FirstX
    @FirstX
    .net developer
    Для общей справки в дополнение к первому ответу, есть грубо говоря 2 основных разновидности таймеров:

    1. System.Threading.Timer - Ставит задачу в пул потоков, поэтому подходит для тех, случаев, когда задача выполняется по таймеру в фоновом режиме. Например ваш объект изменяет параметр Х, но на форме этого не видно.

    2. System.Windows.Forms.Timer (для WinForms) / System.Windows.Threading.DispatcherTimer (WPF и Silvelight) и System.UI.XAML.DispatcherTimer для приложений Win Store еще есть - это все аналоги, которые вызывают исполнение метода в том же потоке, что и был вызван. Благодаря этому, обеспечивается доступ к элементам графического интерфейса, но при этом сюда лучше не помещать сложную вычислительную логику
    Ответ написан
    Комментировать
  • Как в C# осуществить выход из потока (с другого класса)?

    FirstX
    @FirstX
    .net developer
    Мне кажется задача изначально возможно так спроектирована, что получаются запутанные решения. Первая мысль про отмену выполнения потока была тоже сделать на базе CToken, но получается токен нужно передавать еще и в метод check (оттуда же вызываем отмену в данном варианте), что лично мне не не очень нравится.

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

    С другой стороны смотрите, получается метод check что-то проверяет. Значит должен возвращать результат проверки (true/ false). По результатам проверки должно приниматься решение о том, прекратить выполнение или продолжить. Мне кажется надо пересмотреть решение задачи, чтобы логика была более очевидной, а не вбросами исключений в разных местах кода.
    Ответ написан
    Комментировать
  • Как сделать AutoComplete форму в C#?

    FirstX
    @FirstX
    .net developer
    Если верно понял условие, то можно попробовать как-то так (первое что пришло в голову)

    string query = String.Format("Select name From myTable Where name LIKE '{0}%'", t.Text);
    DataTable dt = GetMusic(query);
    var names = new string[dt.Rows.Count];
    
    for (int index = 0; index < dt.Rows.Count; index++)
                    names[index] = dt.Rows[index][0].ToString();


    Вместо "myTable" наименование своей таблицы разумеется
    Ответ написан
  • Как вернуть return в функции несколько значенией?

    FirstX
    @FirstX
    .net developer
    Только одно замечание:

    1. Структуры - для значений, которые действительно неразрывно между собой связаны и идут как одно целое. Например координаты Х и Y действительно не имеют смысла по отдельности.
    2. Массив - для однотипного набора элементов
    3. Разбить на несколько отдельных функций в остальных случаях, так как позволяет разделять связности в методах. Есть несколько типов связности, некоторые являются "запахом" в коде.
    Ответ написан
    Комментировать
  • Что делать, есл клиент требует возврат денег за программу?

    FirstX
    @FirstX
    .net developer
    Если вы изначально не заявляли таких гарантий на возврат, то как уже сказали - не возвращать имеете право.

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

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

    А если доведете до того, что "жрать будет нечего", значит что-то с вашим бизнесом не так. Но это лирическое отступление.

    Если все-таки решили давить на отказ, то:

    1. Не возвращайте часть суммы. Да с одной стороны это хоть что-то для клиента, с другой это как-то несерьезно выглядит, лично мое мнение. Займите уже либо одну позицию, либо другую. Какие вы там телодвижения совершаете внутри у себя, по правде никому не интересно.

    2. Опирайтесь на закон о правах потребителя, ПО невозвратное, вы гарантий не давали, полное описание представлено (перечисление какие были возможности ознакомиться с продуктом).

    3. Никаких последствий, кроме подпорченной репутации не ждет. Если конечно клиент не сын высокопоставленного чиновника :)
    Ответ написан
  • Как в ASP.NET MVC избежать дублирования кода в JS и HTML (Razor)?

    FirstX
    @FirstX
    .net developer
    Единственный путь избавления от такого "дублирования", это
    1. либо полностью перемещать формирование html разметки нужного участка в javascript/jquery код (jqGrid пример)

    2. либо полностью перемещать в серверный метод, который формирует частичное представление с нужной моделью данных

    Иначе вы в ситуации, когда на странице вы можете навернуть абсолютно любую html разметку, но программный код вы не хотите учить и рассказать ему, что у вас там вообще есть и как с этим работать. Так можно делать, только в четкой и однозначной структуре, где есть определенные закономерности, которые можно распарсить и проанализировать.
    Ответ написан
    Комментировать
  • Обработка ошибок в Asp.net MVC?

    FirstX
    @FirstX
    .net developer
    Когда тыкаю Continue появляется моя страница ошибки и все нормально.


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


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


    В обоих случаях у вас все нормально, но в вопросе уже что-то не нормально. Возможно не совсем корректно сформулировано условие проблемы.

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

    Если все так, то все просто: в первом случае вы явно вбрасываете исключение в собственной реализации контроллера, то есть у вас есть доступ к коду, где оно вывалилось. Во-втором случае этим занимаются грубо говоря скомпилированные DLLки движка, к коду которых в студии доступа вы не имеете и поэтому исключение там внутри сразу уходит в глобальный обработчик.
    Ответ написан
    Комментировать
  • Можно ли писать на C# под мобильные платформы, ориентированно WP и Android?

    FirstX
    @FirstX
    .net developer
    Ну то, что язык для desktop приложений - ложь и провокация.
    Под WP - это нативный язык.
    Насколько заверяют разработчики производительность Xamarin приложений (ios/ android) близка к нативным решениям, поэтому на самом деле основным недостатком является цена платформы. Для инди-разработчика это 299$ за 1 разрабатываемую платформу.

    Как уже выше сказали, если интересует разработка игр, то Unity позволяет писать на C# на любые мобильные платформы.

    Если вы перейдете скажем на Java для разработки под андроид, то WP/ iOs все равно мимо пройдут, потому что нет совсем универсального языка.
    Ответ написан
    Комментировать
  • Как реализовать обновление содержимого страницы без ее перезагрузки?

    FirstX
    @FirstX
    .net developer
    Добавить AJAX запрос на страницу, который будет по таймеру асинхронно посылать запрос на веб-сервер (например php функция, которая собирает данные с датчиков и возвращает их скажем в JSON формате). После того, как данные получены срабатывает ваш метод, написанный на javascript для такого случая, который и изменяет значения в отображаемом html коде.

    Проще всего делать конечно AJAX запрос на базе JQuery $.ajax, но для вашей задачи вполне можно и на чистом javascript вставить блок кода, который посылает запрос и обрабатывает полученные в ответ данные.
    Ответ написан
    Комментировать
  • Коллеги программисты, подскажите, в какую область программирования податься junior'у?

    FirstX
    @FirstX
    .net developer
    и мне 23, и я тоже программирую на C# и есть работа, но тоже есть такое желание, и чувство более, чем знакомое.

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

    В ближайших планах переезд и поиск места, где есть возможности для самореализации. Если повезет устроиться пусть даже ios джуном - я это сделаю. Если нет, то продолжу дальше C#, но в сторону веба и сервисов. Это первый шаг - стратегический.

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

    возник вопрос, куда идти и что делать, пока есть возможность.


    Жизнь сложная штука и "куда идти, что делать" это вопрос, который предстоит решить лично Вам. А для того, чтобы ориентироваться нужны 2 вещи: компас и карта. Компас - это ваши личные жизненные ориентиры, цели, принципы. Если их еще нет, то самое время их заводить :) Это не абстрактные понятия, а то чем вы живете, как вы живете.

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