Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Общее количество недель в месяце

Как определить общее количество (неполные + полные) недель в произвольном месяце? Исходим из того что неделя начинается с понедельника и заканчивается воскресеньем. Другими словами, сколько строк календаря занимает тот или иной месяц.
Ноя.2015 - 6 недель (01.11 - Вс, 30.11 - Пн) Дек.2015 - 5 недель (01.12 - Вт, 31.12 - Чт)


Ответ

На основании дня недели последнего числа месяца находим число дней прошедших до последнего понедельника. Делим это число на 7 и округляем вверх, получаем кол-во недель прошедших до последней недели, прибавляем 1.
function getWeeks(year, month) // Внимание: Месяцы нумеруются с 0, как принято в JS { var l=new Date(year, month+1, 0); return Math.ceil( (l.getDate()- (l.getDay()?l.getDay():7))/7 )+1; }

Не работает сериализация объекта из xml в string C#

Рутовый класс:
[Serializable] [XmlRoot("Main")] public class MainClass { public MainClass() { Parents = new List(); }
[XmlElement("Parent")] public List Parents { get; set; } }
Есть родительский класс:
[Serializable] [XmlRoot("Parent")] public class MyParent { public enum myEnum : int { One, Two, Three };
[XmlAttribute("Id")] public string Id { get; set; }
[XmlAttribute("Name")] public string Name { get; set; } }
Есть класс, расширяющий его:
[Serializable] [XmlRoot("Parent")] public class MyChild : MyParent { public MyChild() { Child = new List(); }
[XmlElement("Child")] public List Child { get; set; } }
Этот класс раскрывает, что внутри тега Child
[Serializable] [XmlRoot("Child")] public class InnerParameter { public InnerParameter() {
}
[XmlText] public string Value { get; set; } }
Затем, пытаюсь сериализовать:
MainClass newMainXml = new MainClass(); newMainXml.Parents = new List(); MyChild ch = new MyChild ();
ch.Id = "123"; ch.Name = "Stefani";
InnerParameter parameter = new InnerParameter(); parameter.Value = "MyText"; ch.Child.Add(parameter);
newMainXml.Parents.Add(ch);
XmlSerialization.TrySerializeObjectToXmlString(newMainXml, out result);
Хочу на выходе такую XML:

MyText

Получаю ошибку сериализации:
There was an error generating the XML document. The type MyChild was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
Подскажите пожалуйста, что я делаю не так в формировании xml? Почему сериализация не работает? (Есть большое подозрение, что дело тут в наследовании и зависимости классов между собой. Наверно, надо сказать, что MyChild не единственный класс, который расширяет MyParent...)
P.S.: похоже, что тут ситуация как у меня почти: XML-сериализация объекта с полем типа Object C#


Ответ

Проблема решается действительно добавлением [XmlInclude(typeof(MyChild))] таким образом:
[Serializable] [XmlRoot("Parent")] [XmlInclude(typeof(MyChild))] public class MyParent { public enum myEnum : int { One, Two, Three };
[XmlAttribute("Id")] public string Id { get; set; }
[XmlAttribute("Name")] public string Name { get; set; } }
Моя ошибка была в том, что (для сравнения) у меня было написано так:
[Serializable] [XmlRoot("Parent")] [XmlInclude(typeof(MyChild)), XmlInclude(typeof(HisChild)), XmlInclude(typeof(HerChild))] public class MyParent { public enum myEnum : int { One, Two, Three };
[XmlAttribute("Id")] public string Id { get; set; }
[XmlAttribute("Name")] public string Name { get; set; } }
Однако, как я уже говорил, MyChild - не единственный класс, реализующий MyParent, и эти наследники так же необходимо сериализовать. Вот тут хорошая статья: Xml Сериализация и наследование

Как узнать имя пользователя или email в onedrive sdk?

Как, используя OneDriveClientExtensions, узнать имя отображаемое пользователя или email.
string[] scopes = { "onedrive.readwrite" }; IOneDriveClient OneDriveClient = OneDriveClientExtensions.GetUniversalClient(scopes); await OneDriveClient.AuthenticateAsync();


Ответ

Напрямую, используя данную библиотеку, не получить данные пользователя. Но из неё можно получить AccessToken, а затем, используя его, получить данные пользователя при помощи REST API. Имя пользователя можно получить примерно так:
string[] scopes = new string[] { "onedrive.readwrite" }; var client = OneDriveClientExtensions.GetUniversalClient(scopes) as OneDriveClient; await client.AuthenticateAsync(); // забираем access_token var AccessToken = client.AuthenticationProvider.CurrentAccountSession.AccessToken; // запрашиваем данные авторизованного пользователя REST API var uri = new Uri($"https://apis.live.net/v5.0/me?access_token={AccessToken}");
var httpClient = new System.Net.Http.HttpClient(); var result = await httpClient.GetAsync(uri); // получаем данные пользователя в JSON и разбираем его string jsonUserInfo = await result.Content.ReadAsStringAsync(); if (jsonUserInfo != null) { var json = Newtonsoft.Json.Linq.JObject.Parse(jsonUserInfo); string username = json["name"].ToString(); }
Email можно получить примерно так (не забудьте добавить wl.emails в список разрешений scopes)
string[] scopes = new string[] { "onedrive.readwrite", "wl.emails" }; var client = OneDriveClientExtensions.GetUniversalClient(scopes) as OneDriveClient; await client.AuthenticateAsync(); var AccessToken = client.AuthenticationProvider.CurrentAccountSession.AccessToken; var uri = new Uri($"https://apis.live.net/v5.0/me?access_token={AccessToken}");
var httpClient = new System.Net.Http.HttpClient(); var result = await httpClient.GetAsync(uri); string jsonUserInfo = await result.Content.ReadAsStringAsync(); if (jsonUserInfo != null) { var json = Newtonsoft.Json.Linq.JObject.Parse(jsonUserInfo); string username = json["name"].ToString(); string email = json["emails"]["account"].ToString(); }

Помогите разобраться с лицензиями к программам на Qt

Так как я практически написал библиотеку и программу на бесплатной версии Qt, пришло время задуматься о лицезии.
С библиотекой я думаю использовать Apache License 2.0.
Apache даёт пользователю право использовать программное обеспечение для любых целей, свободно распространять, изменять, и распространять изменённые копии, за исключением названия"
Мне это подходит, я все выложу в открытый доступ на Git-hub, я правильно думаю?
Теперь о программе. Вот с программой под десктоп, которая будет бесплатной, выкладывать открытый исходный код на git-hub мне не хочется, я так понял с этого выражения
The Qt Company предоставляет возможность использования открытой лицензии, в рамках которой некоторые модули доступны под LGPLv2.1, LGPLv3/GPLv3, другие – только под LGPLv3.
что исходный код можно не показывать. Какую лицензию для бесплатной проги взять чтобы исходный код все же был закрыт? В принципе на крайний случай я готов выложить исходный код, если так, то надо принять GPL 3.0? Спс если кто то поможет разобраться.


Ответ

По опыту использовать Qt в разных компаниях, обычно использование Qt не требует от вас выкладывать исходники, если вы используете динамическую линкову с Qt (Qt в dll). Лицензию при этом надо брать LGPL. Но вы не можете модифицировать исходники Qt. Если вы статически линкуетесь с Qt то исходный код надо вроде бы выкладывать. Можете посмотреть вот этот сайт по лицензиям: https://tldrlegal.com/license/gnu-lesser-general-public-license-v3-(lgpl-3)
Тут могут быть всякие трюки например: Основаную бизнес-логику помещаете в dll и делаете её закрытой, при этом exe файл открыт и использует Qt для вывода информации.
Также я встречал OpenSource проекты, которые имели открытый исходный код, но продавали платные модули для своих программ.
Ссылка, которая может помочь в выборе под какой лицензией использовать Qt:https://www.qt.io/download-guide/

почему Java stack memory быстрее heap

почему доступ к объектам в стэке быстрее чем к объектам вне стэка ?


Ответ

Управление памятью для стека тривиально: машина просто увеличивает или уменьшает одно значение, так называемый «указатель стека» (stack pointer). Управление памятью для кучи сложнее: память, выделенная в куче, освобождается в произвольные моменты, а каждая область выделенной в куче памяти может быть произвольного размера. Распределителю памяти, как правило, требуется приложить гораздо больше усилий для определения областей, которые можно использовать заново.

Как найти все матрицы состоящие из заданного числа элементов, с ненулевым определителем?

Имеется матрица 7×7. Элементами матрицы может быть любой из 33 элементов. Если мы перебором всевозможные матрицы, то количество комбинаций будет равно 33^49. Это очень долго для компьютера. Но мне не нужны все матрицы, мне нужны лишь те, которые имеет ненулевой определитель. Какие свойства матриц можно использовать, чтобы ускорить поиск неворожденных матриц? Ведь количество таких матриц ограничено в сравнении с общим количеством комбинаций. Какие будет предложения?


Ответ

В постановке ОП задача нерешаема.
Если 33 ненулевых элемента не равны попарно, то существует 33^7 = 42618442977 вариантов их размещения на главной диагонали, . Если это не смущает, можно разместить те же элементы в любой из 7! = 5040 "ладейных" расстановок (по одному на строку и по одному на столбец). И такие коэффициенты можно добавлять многократно (например, использовать свойства блочных матриц).
UPD.
Если задать элементы ниже главной диагонали нулевыми, элементы главной диагонали - ненулевыми, а элементы выше главной диагонали - произвольными, то определитель будет ненулевым (и равным произведению элементов главной диагонали). Если нуль использовать нельзя, то можно заполнить матрицу ниже главной диагонали одним и тем же элементом, главную диагональ - неравными ему элементами, а матрицу выше главной диагонали - произвольно. В этом случае определитель будет произведением разностей элементов главной диагонали и "нижнего" элемента. Перестановка строк и столбцов матрицы может изменить только знак её определителя. Таким образом, количество ненулевых определителей не меньше, чем 33 * 327 * 3321 * 7! = 5040 * 3322 * 327 ≈ 4 * 1047

Как добавить в visual studio 2015 вывод дебажной информации в самом редакторе?

Как добавить показ дебажной информации в Visual Studio 2015 непосредственно в редакторе кода а не в отдельной панели. Хотелось бы как например а Intelij Idea или в chrome:


Ответ

В ReSharper 2017.3.1 как раз появился такой функционал как у вас на скрине. Ну и всегда вы можете навести мышку на переменную в режиме отладки и увидеть значение.