• Какую выбрать тему диссертации?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Нужно выбрать научного руководителя, brainick прав. У вас на кафедре есть несколько руководителей, пройдитесь по ним и порасспрашивайте, чем они занимаются (или, вы уже и так знаете, чем каждый занимается).
    Вы сами выбираете направление, которое вы хотите. Но есть ограничение - как раз руководитель.
    Но иногда, если у вас хорошие отношения с кафедралами, если вы уже себя зарекоммендовали, то могут пойти навстречу, и может быть (может быть!) какой-нибудь руководитель согласится взять руководство вашей темой.
    Но возможно, что лучшим решением будет - взять уже известное направление. Ваша кафедра, скорее всего, занимается чем-то конкретным (или несколькими). И вы возьмёте уже известное направление, и возьмёте какую-то часть общей кафедральной работы. Так и вам будет полегче, и результат будет постабильнее.

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

    P.S. Вы планируете ли дальше пойти в аспирантуру? тогда нужно выбирать тему магистерской так, чтобы она стала заделом аспирантской работы.
    Ответ написан
    Комментировать
  • Как развиваться новичку в c# и направлении разработки приложений под win?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Недавно я отвечал на другой вопрос: Программа «Информационное окно» для компьютеров в локальной сети?, почитайте, что я отвечал.

    Возьмите маленькую задачку, и постарайтесь не просто сделать программу, но сделать правильно, используя различные технологии разработки. Для начала сделайте программку, которую можно сделать за недельку, потому что нанопрограммки за день вас уже не научат сильно.
    Сделайте пару UserControl-ов - вы научитесь разделять большую программу на маленькие части.
    Код этих юзер-контролов используйте с помощью вьюмодели, не пишите код в xaml.cs-файле.
    Освойте свойства зависимости - что это такое, и когда они нужны, а когда можно и без них. Без них сделать хороший юзер-контрол не получится.
    Создавайте события для связи между разными юзер-контролами, если по другому не обойтись.
    Используйте LINQ.
    Установите Resharper (бесплатный EAP).
    Используйте Git, даже для своего минипроекта. Научитесь разделять задачу на подзадачи, и каждую подзадачу комитьте. (Вполне нормально делать несколько коммитов в день)
    Читайте книги, статьи. Каждый день читайте хабрахабр.
    Ни дня без строчки кода :) Есть только один способ стать хорошим программистом - много писать кода.

    Мой ответ получился не про то, что делать прямо сейчас, а про то, как развиваться дальше. Многие из советов относятся не к разработке Win-приложений, и даже не к C#. Но уже через полгода вы станете заметно лучшим программистом.
    Если вы не знаете, какую задачу начать сделать - спросите, подскажем.
    Ответ написан
  • Веб приложение на Symfony Components, как правильно?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    1) По поводу моделей.
    Symfony не пропагандирует MVC и слоя такого как модель нет

    На самом деле, Symfony хотя и не пропагандирует MVC (потому что есть MVVM, например), но легко может использоваться с MVC, всё для этого в ней есть. Единственно чего нет в Symfony - нет готового решения моделей. Почему - потому как разные ОРМы будут использовать разные решения. Но я рекомендую использовать Доктрину, в ней вообще не нужно думать о сложных моделях - просто делайте plain-php класс для объекта, без специальных базовых классов для модели.
    class Person {
        public $firstname;
        public $lastname;
    }

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

    В общем, раз хотите учиться - берите Doctrine2. Возможно, он работает медленнее, но зато даёт очень удобное создание моделей.

    2) По поводу шаблонизатора. Берите Twig. Он прекрасен. Удобно создавать свои функции, легко наследовать и переопределять блоки.

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

    4) Авторизацию с аутентификацией тоже можно использовать симфониевскую - компонент Security.

    5) Не забудьте взять компоненты DependencyInjection, Config, OptionsResolver, Yaml. Подумайте ещё о Routing, Translation, Debug, EventDispatcher, Intl и Validator. И тогда у вас получится Symfony Framework :)
    Ответ написан
    5 комментариев
  • В каком порядке учить c# по тролсену?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Я бы рекомендовал читать вначале всю первую половину (части I - V, главы 1 - 18), а затем читать те остальные части, которые интереснее и важнее для вас.
    Первые пять частей - основы самого языка c# и основы .net. Это пригодится всегда и в любом типе проектов. Разве что, пятая часть не так важна, как предыдущие части, но в любом случае - осознание в пятой части даёт понимание того, как шарп работает вообще.
    А вот в остальных частях рассматриваются конкретные технологии - работа с БД и сетевые программы, работа с оконными приложениями, и создание сайтов.

    В части VI рассматриваются три подхода работы с БД, каждый из них нужен для изучения, хотя использовать вы будете EF (или LINQ to SQL, который в книге не рассматривается). Также в разделе рассматривается работа с сетевым программированием - как передать денные из одной программы в другую (или из двух экземпляров одной программы). Если это вам сейчас не так важно, то вы можете для начала изучить WPF и/или ASP.NET, а потом вернуться к этому разделу.

    Раздел VII рассказывает об оконных программах. Забудьте про WinForms, и используйте WPF - он намного мощнее и удобнее. Единственно, для чего может пригодиться WinForms - это поддержка старых проектов, а также кросс-платформенные платформы (хотя там тоже есть варианты с WPF). В книге не рассмотрены паттерны проектирования, поэтому отдельно изучите паттерн MVVM. Даже сейчас вы не планируете изучать WPF И оконные Win-приложения, то всё равно потратьте время - какой же вы программист, который не может сделать калькулятор? :)

    Раздел VIII рассказывает о создании сайтов с помощью ASP.NET. Но этот раздел самый бесполезный из всей книги - сейчас сайты на ASP.NET делаются по другому, чем автор описывает - гораздо лучше использовать ASP.NET MVC (а вскоре выйдет релиз ASP.NET MVC 5.0, где многое также изменится). Хотя этот раздел всё-равно полезный, благо, не очень большой.
    Ответ написан
    5 комментариев
  • Что выбрать для игр?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если вы уже знаете c++, то подумайте о UnrealEngine.
    Если вы хотите ещё освоить c#, то Unity3d - тоже прекрасный вариант.
    Xamarin - это платформа для разработки кросс-платформенных программ, пишется на c#. Обычно используется для не-игровых программ, а игровые лучше делать в юнити.
    Для игр попроще можно использовать платформы типа Marmalade или Corona, да даже GameMaker.
    Также может быть отличным решением делать программу на html+css+js с помощью Cordova.

    UnrealEngine и Unity3d примерно одинаковы по мощности, традиционно UnrealEngine имеет лучшую графику Unity3d, но язык c# в Unity3d удобнее и заметно проще, чем в UnrealEngine.

    Лично моё мнение - начните работать с Unity3d. Мощный, быстрый, имеет хорошее сообщество, быстро развивается. Плюс, c# - это плюс :)

    Насколько хорошо вы знаете программирование вообще и c++/c# в частности? Поищите здесь вопросы, с чего начать изучать языки.

    Какие движки/фрейворки я буду использовать в дальнейшем?
    А вот это вопрос к вам, а не к нам :)
    Ответ написан
    Комментировать
  • Доступ из другого потока, зависание Invoke, как решить?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вопрос в том, в каком потоке вызывается эта функция.
    Вместо this.Invoke поставьте Dispatcher.BeginInvoke.
    Ответ написан
    Комментировать
  • Как с listBox1.SelectedItem сделать масcив?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    // получаем строку с элементами
    string Str1 = listBox1.SelectedItem.ToString();
    // разделяем строку в массив строк по символу "пробел"
    var strings = Str1.Split(' ');
    // Преобразуем все строки в числа
    var items = strings.Select(double.Parse);
    // Находим максимальный элемент
    var max = items.Max();
    // Ищем индекс максимального элемента
    var maxIndex = Array.IndexOf(items, max);
    
    // Можно сократить запись:
    string Str = listBox1.SelectedItem.ToString();
    var items = Str.Split(' ').Select(double.Parse).ToArray();
    var maxIndex = Array.IndexOf(items, items.Max());
    Ответ написан
    Комментировать
  • C# вернуть массив из класса?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Во-первых, не нужно пересоздавать список в цикле. Вы уже создали список в начале метода - вот его и используйте, иначе в каждом найденном элементе xml-документа затираются ранее найденные элементы (разве что вы так и хотите сделать, и то - лучше сделать это по другому). Уберите list = new List(); в цикле.

    Во-вторых, вы уверены, что "Ссылка на объект не указывает на экземпляр объекта" - проблема с DbConf[0], а не с logger? Или, скорее, проблема в самом методе. Например, в n.SelectSingleNode("server").InnerText - и правда есть элемент "server"?. Потому что этот код метода выглядит как правильный.
    Поставьте брейкпоинт в метод, и посмотрите по шагам, где именно возникает исключение.

    Ну и в-третьих, названия методов принято называть, начиная с глагола. Метод (функция) - это действие с данным, а не данные. Назовите метод ReadXml().

    UPD.
    но как мне обратиться из любого места программы к данным?

    Сколько у вас конфигов? Больше одного? ведь у вас список, значит, нужно выбирать конкретный конфиг:

    var configs = DbConfig.GetDbConf();
    Console.WriteLine("{0} {1}", c[0].Server, c[0].Port);


    А если вы знаете имя сервера, то используйте словарь вместо списка:
    public static Dictionary<string, DbConf> GetDbConf()
    {
    	try
    	{
    		var configs = new Dictionary<string, DbConf>();
    		
    		// ...
    
    		foreach (XmlNode n in xml.SelectNodes(Properties.Settings.Default.setting_node))
    		{
    			string server = n.SelectSingleNode("server").InnerText;
    			configs.Add(server, new DbConf
    			{
    				Server = server,
    				Port = n.SelectSingleNode("port").InnerText,
    				User = n.SelectSingleNode("user_id").InnerText,
    				Pass = n.SelectSingleNode("password").InnerText,
    				Db = n.SelectSingleNode("database").InnerText
    			});
    		};
    		return list;
    	}
    	catch (Exception msg)
    	{
    		logger.Debug(msg);
    		return null;
    	}
    }

    var configs = DbConfig.GetDbConf();
    var serverName = "localhost";
    var config = configs[serverName];
    Console.WriteLine("{0} {1}", config.Server, config.Port);


    И сделайте в классе более типизированные поля - Port и User можно сделать int (тогда уж не User, а UserId).
    Ответ написан
    Комментировать
  • Как правильно инициализировать данные в Unity C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Это как раз тот случай, когда ваш код нужно писать в Awake(), а не в Start(). Awake() запускается сразу после запуска игры (для каждого объекта), потом происходит первоначальная настройка всех объектов, и после этого запускается Start() (опять же - для каждого объекта). Юнити не указывает, в каком порядке будут инициализированы объекты сцены. Поэтому, в Awake() пишите код, связанный с этим самим объектом, а код, связанный с другими объектами, пишите в Start().
    Ответ написан
    3 комментария
  • Программа "Информационное окно" для компьютеров в локальной сети?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если вы хотите не только сделать проект для портфолио, но и научиться, то вам нужно узнать, как сейчас делают промышленные проекты.

    Во-первых, это WPF, никакого WebForms. Научитесь использовать привязки (bindings).
    Во-вторых, обязательно освойте MVVM - этот паттерн заметно улучшает архитектуру проекта, особенно большого.
    В-третьих, ознакомьтесь (а лучше - попробуйте) с паттернами проектирования (читайте "банду четырёх").
    В-четвёртых, научитесь использовать системы контроля версий - Git (можно и SVN может пригодиться). Заодно, свой проект выложите на гитхаб.

    Если вы уже неплохо знаете C# в частности и программирование вообще, то настоятельно рекомендую книгу Эндрю Троелсена "Язык программирования C# 5.0 и платформа .NET 4.5". Это не учебник по программированию. Это основательнейший труд (более 1300 страниц!) обо всём - о языке C#, о .NET, о WPF, о ASP.NET, о сетевом программировании.

    А о самой программе вам хорошо ответил Антон Федорян.
    Ответ написан
    Комментировать
  • Какой тип данных для работы с двоичной системой счисления существует в C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    public struct MyBool
    {
        private byte _val;
    
        public byte Value
        {
            get { return _val; }
            set { _val = (byte)(value == 0 ? 0 : 1); }
        }
    
        public MyBool(int a)
        {
            _val = (byte)(a == 0 ? 0 : 1);
        }
    
        public override string ToString()
        {
            return _val == 0 ? "0" : "1";
        }
    
        public override int GetHashCode()
        {
            return _val;
        }
    
        public override bool Equals(object obj)
        {
            return _val == ((MyBool)obj).Value;
        }
    
        public static implicit operator MyBool(int a)
        {
            return new MyBool(a);
        }
    
        public static implicit operator int(MyBool a)
        {
            return a._val;
        }
    }


    MyBool[] arr1 = {1, 0, 1, 1, 0, 0, 0, 1};
    MyBool[] arr2 = {1, 0, 2, 3, 0, 0, 0, -5}; 
    // автоматически преобразуется в {1, 0, 1, 1, 0, 0, 0, 1}
    // во всех си-подобных языках не-ноль - это истина
    Ответ написан
    Комментировать
  • C# WPF нажатие кнопки при нажатии enter?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    У кнопки есть свойство IsDefault. Поставьте туда истину.
    Ответ написан
    4 комментария
  • Как сравнить два List?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Используйте Where:
    var list3 = list1.Where(i => !list2.Contains(i.vopros)).ToList();

    Или Except, если второй список вообще не содержит искомых объектов:
    var list3 = list1.Except(list2).ToList();
    В классе переопределите Equals и GetHashCode, чтобы не обязательно реализовывать компарер.
    Ответ написан
    1 комментарий
  • Как хранить данную структуру данных?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Игроки в списке. У каждого игрока список наложенных эффектов - List<Effect>. Эффект не должен обрабатывать изменения на игрока, он только хранит информацию об эффекте (это будут очень простые классы с парой-тройкой свойств).

    Игрок не должен сам обрабатывать эффекты, для обработки сделать отдельный класс, что-то типа EffectDealer. И в классе обработки хода для каждого игрока запускать этот класс - что-то типа new EffectDealer(gamer).Deal();

    И для каждого эффекта у вас будет отдельный класс, который будет изменять свойства игрока в зависимости от эффекта.

    Умеете пользоваться интерфейсами? С ними будет гораздо удобнее, если сделать такую архитектуру, как я предлагаю. Если нужна помощь по моей архитектуре, то скажите, я напишу образцы классов для пары эффектов.
    Ответ написан
  • Как сделать чтобы при нажатии на кнопку событие click генерировалось только для нее?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Можно попробовать разделить кнопки. Grid очень легко позволяет отобразить один элемент поверх другого. Или у вас по бизнес-логике ToggleButton обязательно должен быть внутри Button?
    Ответ написан
    Комментировать
  • Как реализовать обработчик консольных комманд в приложении?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Разделяйте строку по пробелу - так вы получите имя команды и параметры, в первом элементе массива - имя команды, в остальных - параметры. Каждый параметр нужно разделить по символу "="- и вы получите имя параметра и значение.
    Дальше, хорошо создать интерфейс (и/или абстрактный класс) хендлера команды и реализовать интерфейс для каждой команды. Так у вас получится несколько классов, по одному для каждой команды. Останется выбрать нужный хендлер, и запустить его, указав ему параметры. Если команд много, то можно подумать о дальнейшем разделении классов хендлеров на подгруппы.

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

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    >Как правильнее обращаться к сторонниму API
    Лучше всего, сделать сервис, в котором будет ваш код связи с-чем-угодно. А в самом приложении использовать сервис, как высокоуровневый элемент. Если вы видите, что этот код может в будущем будет использоваться в разных проектах, то тогда есть смысл вынести в отдельный бандл. Я не вижу большого смысла разделять один проект на разные бандлы (разве что специально сделать их очень слабо связанными).
    Почитайте мой ответ в другом вопросе.

    >как дополнять либы новым функционалом?
    Форкнуть либу, дополнить вашим кодом, и подключать ваш форк. Это общее правило, не только для Symfony, и не только composer. Иначе, если автор библиотеки выпустит новую версию (новую функцию или исправление бага), то ваше изменение будет конфликтовать с новой версией либы.
    Ответ написан
    Комментировать
  • Можно ли использовать switch внутри for в twig?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Twig не поддерживает тег {% switch %}. Используйте if/elseif вместо него.
    Ответ написан
    5 комментариев
  • Форма и валидация со стороннего сервиса. Как правильно поступить?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Форма создаётся в первом бандле, но (в данном случае) не используется, а используется во втором бандле? То есть, форма использует Request в контроллере во втором бандле?

    Сделайте форму отдельным сервисом, не используйте создание формы через билдер в контроллере. Это, кстати, вообще удобнее - сначала создать форму, а в контроллере создать её через $form = $this->createForm('my_form');
    Ответ написан