Страницы

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

суббота, 8 июня 2019 г.

Как измерить размер текста в WPF?

Как измерить размер текста в текстбоксе от края первой буквы до края последней?
FormattedText formattedText = new FormattedText(str, CultureInfo.GetCultureInfo("en-us-ru"), FlowDirection.LeftToRight, new Typeface(this.Name_textBox.FontFamily, this.Name_textBox.FontStyle, this.Name_textBox.FontWeight, this.Name_textBox.FontStretch), Name_textBox.FontSize, Brushes.Black);
double width = formattedText.Width;
Этот способ возвращает размер текстбокса, а нужна именно длина текста. Ничего другого не нашел.


Ответ

Решение простое — нужно создать на основе вашего текста геометрию и просто посмотреть ее границы:
var dpiX = 96.0 * VisualTreeHelper.GetDpi(this).DpiScaleX; var formattedText = new FormattedText( MyTextBox.Text, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface( MyTextBox.FontFamily, MyTextBox.FontStyle, MyTextBox.FontWeight, MyTextBox.FontStretch), MyTextBox.FontSize, Brushes.Black, dpiX); var geometry = formattedText.BuildGeometry(new Point()); var bounds = geometry.Bounds; MessageBox.Show($"{bounds.Width}");


Полный код примера. Разметка:


Регулярное выражение - вырезать указанные символы

Имеется регулярное выражение вида:
/[\0\x0B\t

\f\a&=+%#<>"~:`@\?\[\]\{\}\|\^'\\]/
Но вырезает не все символы. Остаются:
/ . ; № * ! ()
Не могу корректно доработать выражение на удаление и этих символов. Прошу помощи


Ответ

Можно пойти от обратного - вместо перечисления символов для удаления, в символьный класс можно записать символ отрицания ^, за которым перечислить набор символов, которые нужно оставить. Например, вам нужно удалить всё, кроме буквенных символов и цифр - тогда шаблон можно записать так: '~[^\pL\d]~u'. На php решение можно записать так:
$str = "\0\x0B\t

\fHe&=+%#\"~:`@?[l]{o}|^'\\ 5678м:?*/и.;№*!(р)";
echo preg_replace('~[^\pL\d]~u', '', $str);
Результат:
Hello5678мир

Разные перегрузки универсального метода в зависимости от указанного типа

товарищи! Наткнулся я тут на старенькое интеревью с Джоном Скитом на хабре. В его рамках Джон задал читателям следующий вопрос:
Как вы можете заставить этот код скомпилироваться, так чтобы он вызвал три различные перегрузки метода?
void Foo() { EvilMethod(); EvilMethod(); EvilMethod(); }
Мне не совсем понятно, как можно реализовать такую вещь, ведь даже если использовать where, то мы получаем ошибку, что метод с таким же названием и параметрами уже существует. На SO искал, в Google тоже (возможно, искал плохо, так что если что - палками не бейте)) Будет очень интересно выслушать ваши идеи, так что заранее спасибо)


Ответ

Удалось сделать только так:
public interface IEvilMethod { void EvilMethod(); }
public class Example : IEvilMethod, IEvilMethod, IEvilMethod { public void Foo() { ((IEvilMethod) this).EvilMethod(); ((IEvilMethod) this).EvilMethod(); ((IEvilMethod) this).EvilMethod(); }
void IEvilMethod.EvilMethod() { Console.WriteLine(typeof(T)); }
void IEvilMethod.EvilMethod() { Console.WriteLine(typeof(T)); }
void IEvilMethod.EvilMethod() { Console.WriteLine(typeof(T)); } }
Update
Нашел решение здесь
public class ReferenceGeneric where T : class { }
public class EvilClassBase { protected void EvilMethod() { Console.WriteLine("int?"); } }
public class EvilClass : EvilClassBase { public void Run() { EvilMethod(); EvilMethod(); EvilMethod(); }
private void EvilMethod(ReferenceGeneric arg = null) where T : class { Console.WriteLine("string"); }
private void EvilMethod(T? arg = null) where T : struct { Console.WriteLine("int"); } }

Составление паттернов

Нужно вырезать некий блок символов из строки блок вот такой
ParName{ //content }
Мне нужно вырезать и ParName и { и content и } Я использую
Pattern p = Pattern.compile(".*?\\{+\\}"); Matcher m = p.matcher(out); f(m.find()){ System.out.println(m.group().subSequence(0, m.group().length())); }else{ System.err.println("Ошибка"); }
Выводит Ошибка, -не нашел?


Ответ

Регулярные выражения интересная вещь. Когда кажется, что уже предусмотрел всё, что нужно, возникает еще пятнадцать идей, как усовершенствовать свою регулярку и написать более однозначно :).
Предлагаю такой вариант регулярки для решения задачи:
Pattern p = Pattern.compile("(?ms)(?:ParName\\{){1}(.*[^}].*){0,1}[}]{1}"); Matcher m = p.matcher("ParName{ my
internal
\t\ttext }"); if(m.find()) { System.out.println("result: " + m.group(1)); } else { System.out.println("not found ..."); }
Полезно посмотреть:
Исходники класса Pattern. Документация Pattern Пример использования: match-multiline-text-using-regular-expression java-regex-tester
П.С. Еще пример регулярного выражения от активного участника "(?ms)(?:ParName\\{)([^}]*)\\}"

Firebase Database recyclerView

Немного глупый вопрос но все же. Имеется простенькое приложение которое выводит список из базы ФайрБэйс. Все туториалы построены в основном потоке. Насколько это правильно?


Ответ

У Firebase Database все действия по дефолту асинхронны, следовательно заморозки UI при работе с Firebase быть не должно.
P.S. А вопрос не глупый, тоже в свое время им задался:)

Стилизованный нумерованный список с точкой или как сделать составной content?

Стилизованный список очень удобно сделать через значение счетчика, но тогда в content можно поставить только порядковый номер элемента списка. Возможно ли сделать его составным? Хочу иметь на выходе число сразу после которого идет точка. Что-то вроде этого:
content:counter(olNum)+'.';
Но запись такого вида не дает никакого результата, и нумерация вовсе не работает.
Вот рабочий пример:
ol { margin: 0; padding: 0; counter-reset: olNum; list-style: none; } li { position: relative; margin-bottom: 2px; padding-left: 50px; } li:before { counter-increment: olNum; content: counter(olNum); position: absolute; top: 1px; left: 1px; font-weight: bold; color: red; }

  1. one
  2. two
  3. three
  4. one
  5. two
  6. three
  7. one
  8. two
  9. three
  10. one
  11. two
  12. three


Ответ

Решение слишком простое, нужно без "+" в content'е:
ol { margin: 0; padding: 0; counter-reset: olNum; list-style: none; } li { position: relative; margin-bottom: 2px; padding-left: 50px; } li:before { counter-increment: olNum; content: counter(olNum)'.'; position: absolute; top: 1px; left: 1px; font-weight: bold; color: red; }

  1. one
  2. two
  3. three
  4. one
  5. two
  6. three
  7. one
  8. two
  9. three
  10. one
  11. two
  12. three

Не правильно строится маршрут яндекс карта (api)

Я строю маршрут с использованием путевых и транзитных точек. Но яндекс карта не правильно строит маршрут. Она соединяется там где не должна.
Вот ссылка на codepen и код:
function init () { var multiRoute = []; function createMultiRoute(routeData, viaData, color) { multiRoute.push( new ymaps.multiRouter.MultiRoute({ referencePoints: routeData, params: viaData }, { editorDrawOver: false, wayPointDraggable: true, viaPointDraggable: true, routeStrokeColor: "000088", routeActiveStrokeColor: color, pinIconFillColor: color, boundsAutoApply: true, zoomMargin: 30 })); } // Создаем карту с добавленными на нее кнопками. var myMap = new ymaps.Map('map', { center: [55.750625, 37.626], zoom: 14 }); createMultiRoute([ [60.014919, 30.649850], [60.014958, 30.648536], [60.017671, 30.646447], [60.019146, 30.645540], [60.024197, 30.645711], [60.025782, 30.644554], [60.028975, 30.640299], [60.027754, 30.630244], [60.024331, 30.631359], [60.023627, 30.637576], [60.023723, 30.638850], [60.024200, 30.645713] ], { viaIndexes: [1,2,3,4,5,6,7,8,9,10] }, "ff0000"); myMap.geoObjects.add(multiRoute[0]); } ymaps.ready(init); #map { width: 600px; height: 400px; background: #000; }


Как сделать так, чтобы не было подобных соединений?


Ответ

Может у вас там по Плоткина одностороннее движение?
Точнее, на неё нет поворота с перекрёстка.
Маршрут построен правильно, чтобы пройти по точкам, приходится делать круг..
Более простой маршрут
Знак на gmaps

Как получить значение value из тега li?

Решил заменить чекбоксы с помощью списка ul и стилизовать. В итоге столкнулся с проблемой.
Как взять data-attr значение из списка li ?
И если выбрать другой li, то выберется соответствующий data-attr.
Пробовал эти варианты, но там почему-то берется только первый li и больше не переключается:
function costCalculator() { document.getElementById('result').innerHTML = parseInt(document.getElementById('area').value) + 1; }
и
function costCalculator() { result.innerHTML = parseInt(area.value) + $('.rooms.active').attr('data-attr'); }
\ \ \ \
Песочница для экспериментов: https://jsfiddle.net/Mesuti/5kugx8j6/5/

  • 1 комнатная
  • 2 комнатная
  • 3 комнатная


Результат:


// Математика Input + Data-attr. ВМЕСТО XXXXXXX НУЖНО ВЗЯТЬ ЗНАЧЕНИЕ LI. ЕСЛИ ВЫБИРАТЬ ДРУГОЙ LI, ТО ЗНАЧЕНИЕ МЕНЯЕТСЯ.
function costCalculator() { result.innerHTML = parseInt(area.value) + XXXXXXX; }


Ответ

чтобы значение из data-attr складывалось со значением площади area необходимо привести значение к числу с помощью parseInt():
parseInt($('.rooms.active').attr('data-attr'))
Кроме того при переходе на следующую вкладку необходимо делать пересчет, т.е. вызывать функцию costCalculator по клику на вкладке.
$('#kvart').click(function() { $('#area').fadeOut(100, function () { $('#room').fadeIn('100'); }); }); $('#house').click(function() { $('#room').fadeOut(100, function () { $('#area').fadeIn('100'); }); }); $('#kommerc').click(function() { $('#room').fadeOut(100, function () { $('#area').fadeIn('100'); }); }); $('#home').on('click', 'li', function(){ $(this).addClass('active').siblings().removeClass('active'); }); $('#room').on('click', 'li', function(){ $(this).addClass('active').siblings().removeClass('active'); costCalculator(); }); function onInput() { costCalculator(); } // Математика Input + Data-attr function costCalculator() { result.innerHTML = parseInt(area.value) + parseInt($('.rooms.active').attr('data-attr')); } document.getElementById('area').addEventListener('input', onInput); .characteristic { list-style: none; margin-left: 0; opacity: 1; } .characteristic li { display: inline-block; border: #F03226 solid 1px; padding: 14px 24px; color: #606060; transition: all 0.2s linear; } .characteristic li:hover { background-color: #F03226; color: white; cursor: pointer; } .active { background-color: #F03226; color: white !important; } #area { border: #F03226 solid 1px; padding: 14px 24px; color: #606060; margin-left: 40px; } #area:active, #area:focus { outline: none; } .dn { display: none }

  • Квартира
  • Дом
  • Коммерческие помещения
  • 1 комнатная
  • 2 комнатная
  • 3 комнатная

Результат:


Выбрать максимальное и минимальное значение по модулю из массива

Задача: Найти максимальный/минимальный по модулю элемент массива. Нагуглил только Math.abs, но не понял как применить, подскажите. Еще очень хочу услышать критику кода от опытных программистов.
function mission(){ var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 200, -210, -10000, -9, -8, -7, -6, -5, -4, -3, -2, -1, -100];
var numbersPositive = numbers.filter(function findPositive(numbers){return numbers >= 0}); var maxValue = Math.max.apply(Math,numbersPositive); // Максимальное число
var numbersNegative = numbers.filter(function findNegative(numbers){return numbers < 0}); var minValue = Math.min.apply(Math,numbersNegative); // Минимальное число
document.getElementById('text').value = 'Массив чисел: ' + numbers + '
' + '
' + 'Числа с положительным значением из массива: ' + numbersPositive + ' ' + 'Всего: ' + numbersPositive.length + '
' + 'Числа с отрицательным значением из массива: ' + numbersNegative + ' ' + 'Всего: ' + numbersNegative.length + '
' + '
' + 'Максимальное число в массиве: ' + maxValue + '
' + 'Минимальное число: ' + minValue; }


Ответ

Можно как-то так попробовать.
function mission() { var numbers = [<тут входные данные>], absNumbers = numbers.map(Math.abs), minValue = Math.min.apply(Math, absNumbers), maxValue = Math.max.apply(Math, absNumbers); <тут вывод результатов> }

Парсинг безымянных блоков в AngleSharp

Подскажите пожалуйста как из этого блока выбрать только вот это : 8.85 р / шт

дисконт 8.60
8.85 р / шт

Сейчас пробую так: var price = document.Result.QuerySelectorAll(@".price"); Но в результате выводится все, что находится в блоке


Ответ

Я дал вам ссылку на вопрос на enSO, там есть красивый вариант (через чтение AngleSharp'ом безымянных блоков CSS) и мой варварский в вопросе (вырезанием всех "лишних" нод).
В вашем случае начните с чего-то типа:
var parser = new HtmlParser();
var document = parser.Parse(@"

дисконт 8.60
8.85 р / шт
");
var priceBlocks = document.QuerySelectorAll("div.price");
foreach (var block in priceBlocks) { var element = block.ChildNodes.First(o => o.NodeType == AngleSharp.Dom.NodeType.Text && o.TextContent.Trim() != "");
element.Text().Trim().Dump(); }
Linqpad говорит, что вам вполне сойдёт для начала:

Писал наспех, поэтому подразумеваю, что вы понимаете, что такое linq.

Видна ли схема без объектов

Может ли исчезнуть схема из списка схем в SQL Developer и PL/SQL Developer, если не на один объект из нее у меня нет прав. Исчезла схема из списка, думаю связано с этим. Какие еще могут быть причины, кроме ее удаления?


Ответ

Да, схема будет видна:
show user USER is "SYS"
create user test1 identified externally account lock; User TEST1 created.

show user USER is "ME"
select username, user_id, sysdate, created from dba_users where username like upper('test%');
USERNAME USER_ID SYSDATE CREATED ---------------------- ---------- -------------------- -------------------- TEST1 188 2018-05-18 10:19:30 2018-05-18 10:18:24
Представление dba_users доступно всем через публичный синоним:
select owner, object_name, object_type from dba_objects where object_name='DBA_USERS' ;
OWNER OBJECT_NAME OBJECT_TYPE ---------- -------------------- ------------------- SYS DBA_USERS VIEW PUBLIC DBA_USERS SYNONYM
Поэтому, возможная причина ошибки в инструментах, которые указаны в вопросе .

BackUp БД postgresql через pg_dump не работает при вызове команды из Spring

Дано:
БД postgresql на Mac. В ней есть данные и я могу сделать BackUp из консоли вызвав /Library/PostgreSQL/10/bin/pg_dump -U db_user_name -w -c -f my_db_name.sql my_db_name, что создаст файл my_db_name.sql в папке где я вызываю команду.
Задача:
Настроить периодический BackUp БД через Spring
Проблема:
При вызове вышеуказанного скрипта программно получаю ошибку Файл не найден
Вопрос:
Как же это реализовать? Кажется, проблема в правах доступа к файлам/папкам, но непонятно какая именно и как узнать конкретно.
Пробовал:
Пробовал указывать абсолютный путь типа {ПУТЬ_К_ПРОЕКТУ_СПРИНГА}/my_db_name.sql или /Users/myusername/my_db_name.sql - не помогает.
Код:
@Scheduled(cron = "0 * * * * *") fun backUpDb() { val executeCmd = "/Library/PostgreSQL/10/bin/pg_dump -U $dbUserName -w -c -f $database.sql $database"
val runtimeProcess: Process try { val pb = ProcessBuilder(executeCmd) pb.redirectOutput(Redirect.INHERIT) pb.redirectError(Redirect.INHERIT) runtimeProcess = pb.start() val processComplete = runtimeProcess.waitFor()
if (processComplete == 0) { println("Backup created successfully") } else { println("Could not create the backup") } } catch (ex: Exception) { ex.printStackTrace() } }
Лог:
java.io.IOException: Cannot run program "/Library/PostgreSQL/10/bin/pg_dump -U db_user_name -w -c -f my_db_name.sql my_db_name": error=2, No such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) at ru.scp.quiz.service.quiz.QuizServiceImpl.backUpDb(QuizServiceImpl.kt:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.io.IOException: error=2, No such file or directory at java.lang.UNIXProcess.forkAndExec(Native Method) at java.lang.UNIXProcess.(UNIXProcess.java:247) at java.lang.ProcessImpl.start(ProcessImpl.java:134) at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)


Ответ

Проблема оказалась в том, что команда в одной строке не распознаётся и надо составлять массив из каждой её части и тогда оно работает. Т.е. надо команду в массив превратить при передаче ProcessBuilder-у:
val pb = ProcessBuilder(executeCmd.split(" "))

Событие после полной загрузки HTML5 видео

Есть HTML страница на которой плавно по таймеру появляются элементы (jQuery):
$(window).ready(function(){ $("#site--header").fadeIn(1000); }
В верхней части HTML страницы есть видео. Как сделать так, чтобы появление элементов начиналось после 100% загрузки видео HTML5, которое есть на странице?
Заранее спасибо!


Ответ

Согласно документации События в медиа (audio, video) объектах, не существует пока событий, которые отправляются после 100% загрузки видео.
Но есть события oncanplaythrough и oncanplay, которые, возможно, вам подойдут:
my_video.oncanplaythrough = function(e) { //Событие отправляется, когда состояние готовности изменяется к CAN_PLAY_THROUGH. Указывает, что медиа может быть полностью воспроизведено без перерыва, предполагая, что скорость загрузки остается, по крайней мере на нынешнем уровне. Примечание: Ручная установка CURRENTTIME вызовет событие canplaythrough в Firefox. В других браузерах это может не произойти. }
my_video.oncanplay = function(e) { //Событие отправляется, когда доступно достаточно данных для того, чтобы медиа могло воспроизвестись, по крайней мере, в течение нескольких кадров. Соответствует состоянию (readyState) HAVE_ENOUGH_DATA. }

Как использовать JSON5 в C#

Консольное приложение на С#
Со стороннего сайта получаю json в формате json5:
[{ contentId: 'f1654c004d0207fab3f1f30d9d5f7b1a', date: new Date('05/14/2018 10:50:00') }, { contentId: 'f1954d004d0287fab3f2f30d9d5f7b1a', date: new Date('08/24/2018 10:50:00') }, ... ]
Хранится в строковой переменной.
Вопрос в том какие варианты работы есть с таким существом в C#??
Что пробовал:
Подключить библиотеку JSON5 .NET. Не работает, не компилируется, написано что билд сломан Пройти регуляркой, остановился на проблеме полей с new Date: вот тут


Ответ

Вам может помочь Json.Net от Newtonsoft с кастомным конвертером даты.
Вообще, если гуглить does json.net support json5 мы сразу выходим на то, что поддержка ("большей части" - май 2017 года) уже есть. Но действительно, такие даты как у вас не поддерживаются.
Странный у вас вообще формат времени. Официальная спецификация json5 вообще ничего не говорит о формате времени, это оставлено на откуп спецификациям на Javascript:
JSON itself does not specify how dates should be represented, but JavaScript does. There is no right format; The JSON specification does not specify a format for exchanging dates which is why there are so many different ways to do it. The best format is arguably a date represented in ISO 8601 format (
(См. тут: The “right” JSON date format)
Но... у вас не ISO 8601 даты... у вас вообще в вопросе одни строки, а по ссылке с регуляркой другие (и подозреваю, что там правильно: формат MM/DD/YYYY HH:MM:SS).
В принципе, должно помочь написание кастомного конвертера, чего-то типа JavaScriptDateTimeConverter - вот например, очень похожий пример
Я не знаю, все ли даты приходят в таком формате, не знаю, насколько этот гос. сайт специфицирует такой формат (или может неожиданно перейти на ИСО 8601 - 2001 и поломать вам код), но в принципе, можно написать свой конвертер, обложить для надёжности юнит-тестами и тогда уже использовать в продакшене.
Вот вам рабочий приме для основы:
void Main() { var source = @"[ { contentId: 'f1654c004d0207fab3f1f30d9d5f7b1a', date: new Date('05/14/2018 10:50:00') }, { contentId: 'f1954d004d0287fab3f2f30d9d5f7b1a', date: new Date('05/14/2018 17:43:05') }]"; var parsed = Newtonsoft.Json.JsonConvert.DeserializeObject(source); parsed.Dump(); }
public class SomeClass { public string contentId { get; set; }
[JsonConverter(typeof(JavaScriptGovSiteDateTimeConverter))] public DateTime date { get; set; } }
public class JavaScriptGovSiteDateTimeConverter : JavaScriptDateTimeConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { Type type = (Nullable.GetUnderlyingType(objectType) ?? objectType); bool isNullable = (Nullable.GetUnderlyingType(objectType) != null);
var token = JToken.Load(reader); if (token == null || token.Type == JTokenType.Null) { if (!isNullable) throw new JsonSerializationException(string.Format("Null value for type {0} at path {1}", objectType.Name, reader.Path)); return null; } if (token.Type != JTokenType.Constructor) { throw new JsonSerializationException(string.Format("Invalid Date constructor \"{0}\" at path {1}", token.ToString(), reader.Path)); } var constructor = (JConstructor)token; if (!string.Equals(constructor.Name, "Date", StringComparison.Ordinal)) { throw new JsonSerializationException(string.Format("Invalid Date constructor \"{0}\" at path {1}", token.ToString(), reader.Path)); }
var values = constructor.Values().ToArray();
if (values.Length == 0) { throw new JsonSerializationException(string.Format("Invalid Date constructor \"{0}\" at path {1}", token.ToString(), reader.Path)); } else if (values.Length == 1) { DateTime dt; if (!DateTime.TryParseExact(values[0].ToString(), "MM/dd/yyyy H:m:s", null, DateTimeStyles.None, out dt)) throw new Exception("date format is not MM/dd/yyyy H:m:s");
return dt; } else { throw new Exception("Вот сейчас прям совсем неожиданно было"); } } }

C# Как получить строку без шрифтов?

Есть строка
string text = "𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊";
как из нее получить оригинальний текст без шрифтов ?
вместо
𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊
будет
ana tetyana ana tetyana ana tetyana


Ответ

Вероятно, вам подойдёт одна из форм нормализации:
var text = "𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊 𝚊𝚗𝚊 𝚝𝚎𝚝𝚢𝚊𝚗𝚊"; // text.Length = 65
text = text.Normalize(NormalizationForm.FormKD); // text.Length = 35
FormKC тоже даёт длину 35.
Ссылки на то, что такое нормализация: подробно на английском, чуть-чуть на русском

Oшибка “GET /favicon.ico HTTP/1.1” 404 2255 и как её исправить?

При запуске Django сервера и выполнения каких-то действий в логах всплывает ошибка
"GET /favicon.ico HTTP/1.1" 404 2255
Можете подсказать, из-за чего она возникает, и как её исправить?


Ответ

favicon.ico - это обычно значок сайта во вкладках браузера и при открытии страницы его браузер его пытается запросить (дефолтно).
Добавьте в блок вашей страницы следующее:

Либо вы можете убрать из логов nginx'а:
# skip favicon.ico # location = /favicon.ico { access_log off; return 204; }
Такой-же вопрос на английском с развернутым ответом.

Не отображается иконка приложения

указал в манифесте путь к новой иконке приложения: android:icon="@drawable/icon" Затем сгенерировал апк и установил на другое устройство, но там иконка не отображается. Почему?


Ответ

В AndroidManifest.xml уберите атрибут android:roundIcon="...". Она используется для устройств Андроид 8.+
В создании иконки через New=>ImageAsset она называется Adaptive. Обычная (для всех устройств) - Legacy. Можно отключить там.

Внутреннее закругление Border плюс тень

#main { margin: 40px; height: 200px; width: 250px; border-radius: 10px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); background-color: #fff; }



Помогите решить проблему. Не получается одновременно сделать внутреннее закругление углов и нормальную тень.


Ответ

Конечно не идентично, но думаю суть ясна. Делаем имитацию вогнутой части с помощью box-shadow
body { background: url("http://www.yorkpress.co.uk/resources/images/6599017.jpg?display=1&htype=0&type=responsive-gallery")20% 10%; background-size: cover; } .wrapper { margin: 1rem; } .item { position: relative; background-color: white; width: 500px; height: 100px; margin-bottom: 25px; } .item:first-child { box-shadow: 0 -1rem 1rem rgba(0, 0, 0, 0.3); } .item:last-child { box-shadow: 0 1rem 1rem rgba(0, 0, 0, 0.3); } .item:first-child::before { content: ""; display: block; position: absolute; top: 100%; left: -0.7rem; border-top-right-radius: 60%; border-bottom-right-radius: 60%; width: 25px; height: 25px; box-shadow: 15px 0px 0 4px white; } .item:first-child::after { content: ""; display: block; position: absolute; top: 100%; right: -0.7rem; border-top-left-radius: 60%; border-bottom-left-radius: 60%; width: 25px; height: 25px; box-shadow: -15px 0px 0 4px white; } .item:last-child::before { content: ''; position: absolute; left: 1rem; bottom: 90%; background-color: white; width: 93%; height: 50px; box-shadow: 0 0 3rem black; z-index: -1; }


unity внутри игровые покупки

Вопрос: Есть ли разница между настройкой(IAP) внутри игровых покупок для Android и IOS?
Нашел огромное количество материала по андроиду,но не по ios.
Возможно что-то упустил,если есть у кого-то полезные ссылки(кроме официальной документации) на статьи и тд скиньте пожалуйста(желательно не 2017-2018 гг).


Ответ

Почти нет разницы, если пользоваться готовым UnityIAP. Официальный туториал
Там, разве что, структура ответа отличается. Но если вы на свои серваки посылать receipt на валидацию не собираетесь, то и это не важно.

Как узнать, был ли тип уже объявлен ранее?

Допустим, есть такой код:
typedef int i32;
Как узнать, был ли тип i32 уже объявлен ранее? Т. е. что-то типа #ifdef только для typedef


Ответ

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

Как сделать равными отступы для ТЕКСТА кнопок

Как сделать равными отступы от краёв экрана до ТЕКСТА кнопок? Т.е. от правого края экрана до начала текста правой кнопки, и от левого края экрана - до конца текста левой кнопки? Когда текст в кнопках одной длины, всё выглядит хорошо:
Но когда тексты в кнопках разной длины, расстояние от краёв экрана до текста становится разным:

Вот как выглядит мой layout с кнопками:

Почему исключение можно принимать по ссылке

Почему объект передаваемый в исключении может приниматься по ссылке, хотя он должен только копироваться, то есть при раскрутке стека он копируется из одной области видимости в другую


Ответ

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

Почему наличие унарного плюса в нижеприведенном коде делает ее ошибочной?

(+(("lastIndexOf") in []) ** 55 + 2) + 5


Ответ

Во многих языках, таких как PHP и Python и других, есть оператор возведения в степень (обычно ^ или **), оператор определён имеющим приоритет выше, чем у унарных операторов, таких как унарный + и унарный -, но есть несколько исключений. Например, в Bash оператор ** создан имеющим приоритет ниже, чем у унарных операторов. В JavaScript невозможно написать двухсмысленное выражение, т.е. вы не можете ставить унарный оператор (+/-/~/!/delete/void/typeof) непосредственно перед базовым числом.
Взято ОТСЮДА
Другими словами: это ограничение js'а - нельзя использовать унарный оператор перед базовым числом (числом которое возводится в степень) из-за "двусмысленности".
Варианты исправления.
Явно указываем порядок действий: ((+(("lastIndexOf") in [])) ** 55 + 2) + 5
Используем старый метод: (Math.pow(+("lastIndexOf" in []), 55) + 2) + 5

Как убить IntentService

Для примера я создал сервис с таймером. Туда передаю какие-то параметры для сверки. Через какое-то время я опять запускаю startService, но с новыми параметрами. В таком случае старый сервис нужно убить. stopService как я понял не поможет, onHandleIntent так и останется работать. Может быть можно как-то обновить параметры в старом сервисе?


Ответ

IntentService получаемые параметры обрабатывает по очереди, то есть если вы сначала запустили startService() с одними параметрами, потом еще раз, но с другими параметрами, то будет 1 сервис, который будет обрабатывать запросы по очереди и они (разные запросы) не будут "мешать" друг другу.
Так что "убивать" нет необходимости.

Как запустить программу в visual studio code?

Выскакивает вот такая ошибка, когда нажимаю Отладка -> Запустить без отладки Как решить эту проблему?


Ответ

Тэкс) Visual Studio Code для работы с с++ проектами умеет создавать два файла (я точно не помню, происходит ли это автоматически или вручную) 1. tasks.json Этот файл содержит информацию о сборке вашего приложения. Т.е. что должна делать vsc (cisual studio code), когда вы хотите собрать проект. Пример файла:
{ "version": "2.0.0", "tasks": [ { "taskName": "Debug", "type": "shell", "command": "g++", "args": [ "-std=c++17" , "-D_DEBUG" , "-g" , "-o" , "" , "main.cpp" ], "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] }
Структура файла очень проста, как вы видите в данном случае для сборки будет использован компилятор g++ с аргументами -std=c++17 -D_DEBUG -g -o binary_path main.cpp 2. launch.json Этот файл содержит информацию о том как запускать ваше приложение (например по нажатию Ф5 для дебага) Пример файла:
{ "version": "0.2.0", "configurations": [{ "name": "sudo (gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceRoot}/", "args": ["-s", "start"], "stopAtEntry": false, "cwd": "${workspaceRoot}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [{ "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true }] }] }
В данном случае данный файл описывает как стартануть дебаг для проекта по нажатию Ф5 в редакторе.
Писать с++ный код необходимо непосредственно в .cpp (.c) файлах. Json файлы являются вспомогательными файлами редактора и должны содержать служебную информацию.
Ссылки по теме: https://code.visualstudio.com/docs/languages/cpp https://habr.com/company/microsoft/blog/333680/ https://habr.com/company/microsoft/blog/262523/

Как задать android:layout_marginLeft, android:layout_marginStart кнопке через код?

У меня есть динамически-создаваемая кнопка. Мне нужно чтобы после ее создания она была после определенного элемента. В xml я делал это так:

Позиция элемента в отсортированном массиве

Есть массив:
var arr = ['3','12','43','55','63','90'];
И есть какое-то число, допустим 13 Требуется найти такой индекс в массиве, чтобы элемент, на который он ссылается, был наибольшим из существующих элементов, которые меньше или равны заданному.
К примеру: 13 больше 12 (arr[1]), но меньше 43 (arr[2]), значит метод должен вернуть индекс 1 (вторая позиция) Какими путями это можно реализовать?


Ответ

Собственно, если Ваш массив отсортированный, то Вам поможет старый добрый бинарный поиск, реализованный следующим образом:
function binSearch(arr, toFind) { if (!arr) return -1; var first = 0; var last = arr.length - 1; while (first < last) { var mid = first + Math.floor((last - first) / 2); if (arr[mid] >= toFind) last = mid; else first = mid + 1; } if (arr[last] == toFind || last == 0 || last == arr.length - 1) return last; else return last - 1; } console.log(binSearch(['3', '12', '43', '55', '63', '90'], 13)); // 1
Надеюсь, ответ помог Вам, удачи в Ваших делах!

fstab и монтирование ФС обычным пользователем

Вопрос скорее имеет познавательный характер, чем практический, но всё-же.
Фрагмент fstab:
/dev/disk/by-label/vmf /vmf ext2 noauto,nofail,user,noexec,rw 0 2
Насколько я понимаю, что такая ФС не будет промонтирована автоматически при загрузке. Её может монтировать обычный пользователь
]$ mount /dev/disk/by-label/vmf
Ну а при двойном клике на значёк ФС на рабочем столе все-равно запрашивается пароль администратора.
Можно ли сделать, чтобы пароль не запрашивался, Или монтировалась автоматически при первом обращении к /vmf


Ответ

В полките есть такое правило:
Mount/unmount filesystems defined in the fstab file with the x-udisks-auth option ... auth_admin auth_admin auth_admin_keep

Добавить x-udisks-auth в фстаб
Правила в /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy на эту политику поставить
yes
Без fstab, просто по клику, можно разрешить в политике org.freedesktop.udisks2.filesystem-mount-system. Системные разделы сломать не должен, тк там куча процессов, которые не дадут отмонтировать рут налету.
Чтоб не затерлось при обновлении политику нужно скопировать куда-то в /var/

MySQL Подсчёт уникального количества дней в таблице с диапазонами дат

Пытаюсь найти решение для одной задачки: есть таблица, содержащая Имя, дату начала интервала и дату конца интервала. Суть в том, что у человека с одним и тем же именем - может быть несколько записей, в которых даты могут пересекаться (собственно фото)
Нужно найти для каждого человека (в данном случае для одного Петрова) количество уникальных дней за все даты. То есть не учитывать наложение дат...
Если суммарное количество дней найти по всем записям элементарно - например
SELECT `people_id`, SUM(DATEDIFF(end_date, `start_date`)) AS wd FROM test_days GROUP BY people_id
Или
SELECT SUM(days) total FROM ( SELECT datediff(`end_date`, `start_date`) days FROM test_days ) AS get_days
то как исключить наложения я не додумался.
Если есть добрые люди - поделитесь идеей, пожалуйста.
Сам код таблицы
CREATE TABLE `test_days` ( `people_id` varchar(100) DEFAULT NULL, `start_date` date DEFAULT NULL, `end_date` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test_days` (`people_id`, `start_date`, `end_date`) VALUES ('Петров', '2018-06-05', '2018-06-09'), ('Петров', '2018-05-01', '2018-05-19'), ('Петров', '2018-05-06', '2018-05-19'), ('Петров', '2018-05-03', '2018-05-23');


Ответ

Думаю сначала придется размножить записи, что бы каждая дата из интервала стала отдельной строкой. После чего посчитать уникальные записи.
Для размножения записей удобно пользоваться опорной таблицей с порядковыми номерами от 0 до максимальной длины интервалов, которые могут встретиться. Например создадим такую таблицу:
create table seqnum(X int not null); -- Первые 8 записей insert into seqnum values(0),(1),(2),(3),(4),(5),(6),(7); -- И еще 512 insert into seqnum select s1.x*64+s2.x*8+s3.x+8 from seqnum s1, seqnum s2, seqnum s3;
А теперь можем размножать и считать уникальные:
select d.people_id, count(distinct d.start_date + interval s.x day) days from test_days d, seqnum s where s.x<=DATEDIFF(end_date, start_date) group by d.people_id
Пример на sqlfiddle.com

Открыть и закрыть аудио файл. Ошибка: “wave.Error: file does not start with RIFF id”

Есть функция загрузки аудио:
async def upload_audio_message(api, multipart_data, peer_id): """Upload audio file `multipart_data` and return Attachment for sending to user with id `peer_id`(possibly)"""
sender = api.get_default_sender("docs.getMessagesUploadServer") client = api.get_current_sender("docs.getMessagesUploadServer", sender=sender)
data = aiohttp.FormData() data.add_field('file', multipart_data, filename="message.mp3", content_type='multipart/form-data')
values = {'type': "audio_message", 'peer_id': peer_id}
if client.group_id: values['group_id'] = client.group_id
response = await api(sender=sender).docs.getMessagesUploadServer(**values)
if not response or not response.get('upload_url'): return None
upload_url = response['upload_url']
async with aiohttp.ClientSession() as sess: async with sess.post(upload_url, data=data) as resp: result = json.loads(await resp.text())
if not result: return None
data = dict(file=result['file']) result = (await api(sender=sender).docs.save(**data))[0]
return Attachment.from_upload_result(result, "doc")
Пытаюсь открыть аудио файл что бы загрузить его но что-то я делаю не так помогите пожалуйста:
answer_file = wave.open(self.get_path("winer.mp3"), "rb") audio = await upload_audio_message(self.api, answer_file, msg.user_id) answer_file.close()
raise Error('file does not start with RIFF id') wave.Error: file does not start with RIFF id


Ответ

Ошибка:
wave.Error: file does not start with RIFF id
Используемый модуль wave умеет работать только с форматом WAV, поэтому в этом коде возникает та ошибка:
answer_file = wave.open(self.get_path("winer.mp3"), "rb")

Не проходит регистрация в FireBase

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_email_password); mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null){
} else {
} } }; ETemail = (EditText) findViewById(R.id.et_email); ETpassword = (EditText) findViewById(R.id.et_password);
findViewById(R.id.bt_sign_in).setOnClickListener(this); findViewById(R.id.bt_registration).setOnClickListener(this); }
@Override public void onClick(View view) { if (view.getId() == R.id.bt_sign_in){ signin("us1@gmail.com","12345678"); //signin(ETemail.getText().toString(), ETpassword.getText().toString()); } else if (view.getId() == R.id.bt_registration){ registration("us1@gmail.com","12345678"); //registration(ETemail.getText().toString(), ETpassword.getText().toString()); } }
public void registration (String email, String password){ mAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()){ Toast.makeText(EmailPasswordActivity.this,"Регистрация успешна",Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(EmailPasswordActivity.this,"Регистрация провалена",Toast.LENGTH_SHORT).show(); }
} }); }
Связь с Firebase:
Connect your app to Firebase: connected
Add Firebase Authentication...: Dependencies set up correctly
При попытке регистрации следующие ошибки:
06-15 10:32:28.381 11335-11335/com.example.tug.cloudtasks E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.tug.cloudtasks, PID: 11335 java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.android.gms.common.api.GoogleApi.zzb(com.google.android.gms.common.api.internal.zzdf)' on a null object reference at com.google.android.gms.internal.zzdtp.zzb(Unknown Source:4) at com.google.android.gms.internal.zzdtw.zza(Unknown Source:19) at com.google.firebase.auth.FirebaseAuth.createUserWithEmailAndPassword(Unknown Source:15) at com.example.tug.cloudtasks.EmailPasswordActivity.registration(EmailPasswordActivity.java:75) at com.example.tug.cloudtasks.EmailPasswordActivity.onClick(EmailPasswordActivity.java:55) at android.view.View.performClick(View.java:6256) at android.view.View$PerformClick.run(View.java:24697) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)


Ответ

Думаю, я смогу вам помочь. Регистрацию я делал в трех или четырех проектах, используя следующий код на Kotlin:
auth.createUserWithEmailAndPassword(email!!, password).addOnCompleteListener(this) { task -> if (task.isSuccessful) { onAuthSuccess(task.result.user.uid) } else { showIOSDialog(false) Toast.makeText(this@SignUpActivity, getString(R.string.registration_error), Toast.LENGTH_SHORT).show() } }
В поля email и password вставляете то, что ввел пользователь. В настройках firebase вы должны включить регистрацию по email и паролю: Удачи!
Дополнение № 1 Забыл привести gradle настройки) Я использую последние версии на текущий момент, вы можете удалить не используемые библиотеки:
implementation "com.google.firebase:firebase-core:16.0.0" implementation "com.google.firebase:firebase-auth:16.0.1" implementation "com.google.firebase:firebase-storage:16.0.1" implementation "com.google.firebase:firebase-database:16.0.1" implementation "com.google.firebase:firebase-messaging:17.0.0" implementation "com.google.firebase:firebase-config:16.0.0" implementation 'com.google.android.gms:play-services-location:15.0.1' implementation 'com.google.android.gms:play-services-places:15.0.1' implementation 'com.kelvinapps:rxfirebase:0.0.16' implementation 'com.firebaseui:firebase-ui-database:1.2.0'

Анимация переворота карты

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


Ответ

Использую вот такой класс:
public class FlipAnimation implements Animation.AnimationListener { private Animation animation1; private Animation animation2; private boolean isBackOfCardShowing = true; private ImageView img; private Context ctx; private FlipEnd flipped; Card card;
public interface FlipEnd { void flipEnd(ImageView img, Card card); }
FlipAnimation(Context ctx, ImageView img, Card card) { this.img = img; this.ctx = ctx; this.card = card; flipped = (FlipEnd) ctx; animation1 = AnimationUtils.loadAnimation(ctx, R.anim.flip_to_middle); animation1.setAnimationListener(this); animation2 = AnimationUtils.loadAnimation(ctx, R.anim.flip_from_middle); animation2.setAnimationListener(this);
img.clearAnimation(); img.setAnimation(animation1); img.startAnimation(animation1); }
@Override public void onAnimationStart(Animation animation) {
}
@Override public void onAnimationEnd(Animation animation) { if (animation == animation1) { if (isBackOfCardShowing) { img.setImageResource(R.drawable.card_face); flipped.flipEnd(img,card); } else { img.setImageResource(R.drawable.card_back); } img.clearAnimation(); img.setAnimation(animation2); img.startAnimation(animation2); } else { isBackOfCardShowing = !isBackOfCardShowing; }
}
@Override public void onAnimationRepeat(Animation animation) {
} }
Тут еще сразу добавлен интерфэйс, чтобы отслеживать, когда и какая карта перевернулась. Кастомизируйте его, как хотите.
R.anim.flip_to_middle.xml :

flip_from_middle.xml

Вызывать там, где надо: new FlipAnimation(YourActivity.this, cardImage);
Попробуйте, эффект будет как будто переворачивается карта :)

Не меняется цвет кнопки если контрол динамический

Задача при нажатии на кнопку создать еще одну кнопку с определенным цветом кнопки. Добавляем на форму кнопку при нажатии на которую мы создаем кнопку с заданным цветом.
private static int X = 100; private static int Y = 100; private void buttonDynamic_Click(object sender, EventArgs e) { AddButton(X, Y); X += 100; } private void AddButton(int x, int y) { // создаем контрол System.Windows.Forms.Button buttonDyn = new System.Windows.Forms.Button(); // устанавливаем необходимые свойства buttonDyn.Location = new System.Drawing.Point(x, y); buttonDyn.Name = "button1"; buttonDyn.Size = new System.Drawing.Size(75, 23); buttonDyn.TabIndex = 0; //вот здесь меняем цвет кнопки buttonDyn.BackColor = Color.Chartreuse; buttonDyn.UseVisualStyleBackColor = true; // button1_Click - функция обработчик события нажатия на кнопку buttonDyn.Click += new System.EventHandler(button1_Click); Controls.Add(buttonDyn); // добавляем на форму
}
При нажатии на кнопку buttonDynamic появляется новая кнопка, но цвет ее стандартный серый. Что я делаю не так?


Ответ

Свойство BackColor относится к так называемым AmbientProperties. Смотрите Remarks
Его значение задаётся таким же, как у родительского контрола (это сделано для облегчения конструирования: добавляем контрол - его параметры определяются автоматически).
Пока контрол не добавлен на родительский, нет смысла менять такое свойство. Его нужно менять после добавления.
Controls.Add(buttonDyn); buttonDyn.BackColor = Color.Chartreuse;

Теряется ссылка на один и тот же объект при сериализации-десериализации через DataContract

Пытаюсь сериализовать сложный объект через DataContract. Объект имеет список подобъектов, которые имеют в свою очередь свой список (назовем - листья дерева). К этим листьям, например, первого элемента списка основного объекта, можно добраться их других элементов списка (ссылка одна и та же). Получается довольно сложный граф, в котором много связей.
При десериализации у каждого элемента списка - свои листья, т.е. ссылки теряются, если в объекте источнике - это один и тот же лист, то после десериализации - просто копия.
Примерно так
A A / \ / \ B C ====> B C \ / | | D D D[копия]
(это очень упрощенная схема)
Пробовал для всех классов прописать DataContract(IsReference = true), так, на всякий случай - не помогло.
Есть ли более "быстрый" способ корректной десериализации, кроме как "ручное" выстраивание структуры повторяющей объект-источник?
Спасибо.


Ответ

При создании сериализатора задайте ему настройку PreserveObjectReferences = true
var settings = new DataContractSerializerSettings { PreserveObjectReferences = true }; var dcs = new DataContractSerializer(typeof(SomeType), settings);
Также можно использовать NetDataContractSerializer

Регулярные выражения с условием

Имеется ссылки двух видов:
https://www.test.com/common/inc/productDetail_price.jsp?skuId=2260697&productId=xlsImpprod4130103 https://www.test.com/milk?productId=xlsImpprod18451151
Суть задачи такова: если в ссылке не содержится 'productDetail_price.jsp', то вывести значение параметра 'productId'
Как я делаю:
(?Если использовать противоположный вариант:
(?<=productDetail\_price\.jsp.).*productId=(\w+) - выводит противоположный вариант, который мне нужен
Важный момент: задачу необходимо решить только регулярными выражениями
Адрес для тестов: http://rubular.com/r/6YZVmhMbUj
Буду рад любым советам


Ответ

Рекомендую распарсить URL с помощью стандартного URI + CGI
s = 'https://www.test.com/common/inc/productDetail_price.jsp?skuId=2260697&productId=xlsImpprod4130103' uri = URI.parse(s) if uri.path.split('/').last != 'productDetail_price.jsp' puts CGI::parse(uri.query)["productId"] end
Подробности
uri = URI.parse(s) - инициализируем объект URI if uri.path.split('/').last != 'productDetail_price.jsp' - разбиваем полученный "путь" по / и проверяем последний элемент списка. Если он не равен productDetail_price.jsp CGI::parse(uri.query)["productId"] - парсим строку запроса и берем значение параметра productId
Онлайн-демо на Ruby
Если productDetail_price.jsp может находиться в любом месте URL, можно заменить if uri.path.split('/').last != 'productDetail_price.jsp' на
if !uri.path.include? 'productDetail_price.jsp'
Регулярное выражение
Если нужно решение на основе регулярного выражения, используйте
s[/^(?!.*\bproductDetail_price\.jsp\b).*productId=(\w+)/, 1]
или
s[/^(?!.*\bproductDetail_price\.jsp\b).*productId=\K\w+/]
См. демо выражения на Rubular
Подробности
^ - начало строки (?!.*\bproductDetail_price\.jsp\b) - в строке не должно быть целого слова productDetail_price.jsp (точка экранирована, чтобы находила только символ , \b — это границы слова, (?!...) — негативный блок предварительного просмотра вперёд, если его шаблон находит совпадение, совпадение всего шаблона не находится). .*productId= - 0 и более любых символов (кроме знака перехода на новую строку), как можно больше, до последнего вхождения последующих шаблонов, и потом productId= (\w+) - Захватывающая подмаска №1: 1+ букв, цифр или _ \K\w+ - альтернатива - можно использовать \K, чтобы очистить буфер совпадения, и, таким образом, в нем окажутся только последние 1+ букв, цифр или _

Преобразование Фурье в Pandas

Есть DataFrame примерно такого содержания:
Time Data 95114 1012.0 96078 1108.0 97033 1132.0 98015 1076.0 ...
Состоит из 100 строк, где:
Time - время измерения в микросекундах Data - измеряемое значение.
Мне необходимо найти ДПФ этой зависимости. Все бы ничего, только частота измерения непостоянна. Она немного плывет со временем случайным образом. Т.е. мои потуги в духе:
xf = fftfreq(len(df['Time']),1000) # 1000 взята как примерный период измерений i = xf > 0 yf = fft(df['Data'])
Дают немного неожиданный результат. Я так понимаю, что дело в частоте. Как правильно ее искать? Интерполировать свой дискретный ряд и потом уже находить его ДПФ?
В итоге мне нужно будет найти площадь между определенными частотами спектра.


Ответ

Можно воспользоваться методом DataFrame.resample(), чтобы преобразовать DataFrame во временной ряд с единым интервалом (в качестве единого интервала возьмем средний интервал между замерами в микросекундах) и после этого интерполировать недостающие значения.
Для этого надо конвертировать df.Time в datetime dtype и установить этот столбец в качестве индекса:
In [62]: freq = int(df['Time'].diff().mean()) # средняя частота измерения в микросекундах
In [63]: freq Out[63]: 967
In [64]: df = (df.set_index(pd.to_datetime(df.pop('Time'), unit='us')) .resample('{}U'.format(freq)) .mean() .interpolate())
In [65]: df Out[65]: Data Time 1970-01-01 00:00:00.094766 1012.0 1970-01-01 00:00:00.095733 1108.0 1970-01-01 00:00:00.096700 1132.0 1970-01-01 00:00:00.097667 1076.0
После этого можно попробовать воспользоваться преобразованиями Фурье.

На главной отображать, на всех остальных скрыть!

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


Ответ

каким образом сайд бар отображать на главной странице, а когда переходишь на товар или другую страницу что бы он прятался?
JS - вараинт.
var path = window.location.pathname; var page = path.substring(path.lastIndexOf('/') + 1); console.log(path, page); if(page === "home-page.html"){ // Show sidebar } else if(page !== "home-page.html"){ //Hide sidebar } else{ // Anything else }
widow.location.path - URL содержащий / substring - возвращает подстроку от 0 и до последнего индекса / + 1

Рекурсивная функция для поиска пути в List-ах

Есть n-ое количество элементов в словаре:
Dictionary> dict = new Dictionary>();
В List лежат ключи связующих словарей. То есть, например, словарь с ключом '1' связывается со словарями с ключами 1, 6, 8, 10. А словарь с ключом 90 связывается со словарями с ключами 8, 3, 92, 138.
dict[1] = new List(){ 87, 6, 8, 10 }; dict[90] = new List() { 8, 3, 92, 138 };
Задача - найти кратчайший путь между словарями dict[1] и dict[90] по их связям. То есть сначала сравнить все элементы в списке словаря с ключом 1 с 90. Потом сравнить по-очереди каждый элемент списка в словаре с ключом '87' с 90, потом каждый элемент списка в словаре с ключом '6' и так далее, пока не будет достигнуто совпадение с 90. Полученный путь нужно запомнить в отдельный List, в котором будут ключи словарей в пути.
Пример:
dict[1] = new List(){ 3, 5 }; dict[3] = new List(){ 1, 8 }; dict[5] = new List(){ 1 }; dict[8] = new List(){ 3, 90 }; dict[90] = new List() { 8 };
Нужно найти кратчайшее расстояние от dict[1] до dict[90]. Сначала сравниваем все элементы в dict[1] с 90. Элемента 90 в списке словаря '1' нет. Ищем дальше: берём первый элемент списка словаря с ключом '1' (3) и сравниваем элементы словаря dict[3] с 90. Элемента 90 в списке словаря '3' нет. Берём следующий элемент списка словаря '1' (5). Там сравниваем всего один элемент и тоже нет совпадений.
Теперь углубляемся и рассматриваем элементы словаря '3' как отдельные словари. Т.е. проверяем dict[1] - ничего нет. Проверяем dict[8] - совпадение. Поиск закончен!
При этом нужно запоминать путь. В качестве вывода использовать
List output = new List();
В который по порядку будут записываться ключи словарей в пути. В примере он будет состоять из элементов:
output.Add(1); output.Add(3); output.Add(8); output.Add(90);
Очевидно, нужно использовать рекурсию для прохождения по всем элементам списков.


Ответ

Рекурсию можно использовать, но не нужно. Задача сводится к обходу графа в ширину. Где словари - это вершины графа. А ключи доступа - ребра. Замечу, что это орграф.
Извиняйте за введение собственной системы ввода данных, писал, чтобы проверить работоспособность. А раз написал, не грех и поделиться.
На вход поступает 2 числа, N - кол-во ключей и M - кол-во записей о этих ключах. В следующих M строках описываются ключи в формате: 1-e число - ключ, последующие через пробел - ключи других словарей. Далее программа требует два числа X и Y. От какого словаря требуется найти путь к другому.
Программа выводит кратчайший путь, если таковой существует, иначе "Don't exist".
string[] Inp = Console.ReadLine().Split(); // Заносим данные ==>> int N = Convert.ToInt32(Inp[0]), M = Convert.ToInt32(Inp[1]);
Dictionary> dict = new Dictionary>(); for (int i = 0; i < N; i++) dict[i] = new List();
for (int i = 0; i < M; i++) { Inp = Console.ReadLine().Split(); int Temp = Convert.ToInt32(Inp[0]) - 1; for (int j = 1; j < Inp.Length; j++) { dict[Temp].Add(Convert.ToInt32(Inp[j]) - 1); } }
Inp = Console.ReadLine().Split(); int X = Convert.ToInt32(Inp[0]) - 1, Y = Convert.ToInt32(Inp[1]) - 1; // <<== Все еще заносим
Queue Work = new Queue(); // BFS работает через очередь. bool[] Mark = new bool[N]; // Массив, в котором будем помечать посещенные словари int[] Log = new int[N]; // Потребуется для вывода найденного пути bool Exist = false; // Существует ли наш путь вообще
Work.Enqueue(X); // см. Алгоритм BFS (обход в глубину) Mark[X] = true; Log[X] = -1;
while (Work.Count > 0) { int v = Work.Dequeue();
for (int i = 0; i < dict[v].Count; i++) { if (!Mark[dict[v][i]]) { if (dict[v][i] == Y) Exist = true;
Work.Enqueue(dict[v][i]); Mark[dict[v][i]] = true; Log[dict[v][i]] = v; } } }
if (Exist) { List output = new List(); // Восстанавливаем путь for (int v = Y; v != -1; v = Log[v]) output.Add(v);
output.Reverse();
for (int i = 0; i < output.Count; i++) Console.Write(output[i] + 1 + " "); Console.WriteLine(); } else Console.WriteLine("Don't exist");
Вот пример работы:
Входные данные:
100 6 1 2 3 4 5 5 2 3 1 45 42 13 54 42 13 3 45 42 54 1 13
Выходные данные:
1 3 45 13
Надеюсь, помог.

Кастомная кнопка. Анимация одной кнопки при нажатии на другую

В меню игры нужна кнопка для выбора режима игры. Обычный выпадающий spinner не подходит. Захотелось вот такую штуку:
Начать игру < Режим 1 > Рекорды Настройки Выход
Либо стрелки будут вызывать анимацию движения кнопки и вместо Режим 1 выйдет кнопка Режим 2. Важно чтобы была плавная анимация. Вот думаю как же это реализовать. Ну первая стрелка это кнопка , посередине ImageView ? или не кликабельная кнопка описанная в xml как анимированная. При нажатию на стрелку нужно вызвать анимацию ухода ImageView в правую часть экрана и прихода уже с другим текстом с левой части экрана. (даже лучше использовать TextView с backgroud) Ну в общем я думаю понять, что я хочу совсем не сложно. Хочу понять как это реализовать правильно, чтобы не учиться на своих ошибках, времени на это к сожалению нет.
Попробовал класс Animation, в нём 4 типа анимации, вот гифка вначале статьи. Есть вариант с уходом кнопки вправо и возвратом так же справа, не знаю можно ли её адаптировать так чтобы возврат был с левой стороны экрана и вообще можно ли в процессе анимации в нужный момент менять текст кнопки?


Ответ

Можно использовать LinearLayout с ImageView/TextSwitcher/ImageView
Про TextSwitcher можно почитать здесь
Анимацию в одну сторону устанавливайте так:
in = AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left); out = AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right);
в другую, вам понадобится такой класс:
public class ReverseInterpolator implements Interpolator { @Override public float getInterpolation(float paramFloat) { return Math.abs(paramFloat -1f); } }
использовать, прямая:
in.setInterpolator(new LinearInterPolator()); out.setInterpolator(new LinearInterPolator());
обратная:
in.setInterpolator(new ReverseInterpolator ()); out.setInterpolator(new ReverseInterpolator ());
Другой вариант:
Не использовать TextSwitcher, а собрать анимацию самому. Плюсы - можно анимировать любые View. Минусы - надо самому прописывать всю анимацию. Хотя это не так сложно. В приведенных вами ссылках есть варианты. Если что-то по ним не понятно - спросите.

Сапер на JavaScript

создаю сапера на JS, есть двумерный массив заполненый нулями и единицами ,1 это мина, нужно создать массив заполненый числами количеством мин вокруг ячейки, не получаеться сделать из-за границ массива.
var mineField = [ ['0', '0', '0', '1', '0'], ['0', '1', '0', '0', '0'], ['0', '0', '1', '0', '1'], ['1', '0', '0', '1', '0'], ['0', '0', '1', '0', '0'] ];
var markField=[]; for(var i = 0;i< mineField.length;i++){ markField[i] = []; for(var j = 0; j< mineField[i].length; j++){ if(field[i][j] == 1) markField[i][j] = "-1";//если мина то вносить -1 else{ var mineCounter = 0;//Количество мин вокруг ячейки if (field[i-1][j-1] === 1) mineCounter++; if (field[i-1][j] === 1) mineCounter++; if (field[i-1][j+1] === 1) mineCounter++; if (field[i][j-1] === 1) mineCounter++; if (field[i][j+1] === 1) mineCounter++; if (field[i+1][j-1] === 1) mineCounter++; if (field[i+1][j] === 1) mineCounter++; if (field[i+1][j+1] === 1) mineCounter++; markField[i][j] = mineCounter; } } }


Ответ

Передумал закрывать как дубликат Не работает счетчик мин вокруг, так как это другой способ, который тоже имеет право на существование.
var field = [ [0, 0, 0, 1, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 1], [1, 0, 0, 1, 0], [0, 0, 1, 0, 0] ]; var mark = []; for (var i = 0; i < field.length; i++) { mark[i] = []; for (var j = 0; j < field[i].length; j++) { if (field[i][j] == 1) mark[i][j] = 9; // для красоты вывода результата, 9 тоже не может быть else { var counter = 0; if (field[i - 1] && field[i - 1][j - 1] == 1) counter++; if (field[i - 1] && field[i - 1][j] == 1) counter++; if (field[i - 1] && field[i - 1][j + 1] == 1) counter++; if (field[i][j - 1] == 1) counter++; if (field[i][j + 1] == 1) counter++; if (field[i + 1] && field[i + 1][j - 1] == 1) counter++; if (field[i + 1] && field[i + 1][j] == 1) counter++; if (field[i + 1] && field[i + 1][j + 1] == 1) counter++; mark[i][j] = counter; } } } for (i = 0; i < mark.length; i++) console.log(JSON.stringify(mark[i]));

Как подключиться к github из visual studio?

В Visual Studio уже встроен Git. Везде пишут только как скачать уже имеющийся удалённый репозиторий с git hub'а, но нигде, как подключиться к гитхаб аккаунту из visual studio Итак, у меня есть аккаунт на guthub, я создал приложение на локальном компе. Как мне через visual studio без доп плагинов подключиться к своему аккаунту, создать новый репозиторий и запушить папку с проектом в него?


Ответ

Открыть Team Explorer (View - Team Explorer), затем кликните по иконке штепселя (Manage Connection):

Более подробное описание в документации
PS Ещё в меню View - Other Windows есть пункт Github, но я им не пользовался, так как гитхабом не пользуюсь так как мне приходится чаще с tfs работать.

Одновременный перебор нескольких значений

int main() { string t1 = "L", t2 = "u", t3 = "k", t4 = "c", t5 = "y"; string temp1, temp2, temp3, temp4, temp5; temp1 = '0', temp2 = '0', temp3 = '0', temp4 = '0', temp5 = '0'; while ((t1 != temp1) && (t2 != temp2) && (t3 != temp3) && (t4 != temp4) && (t5 != temp5)) { temp1 = rand() % 'a' + 32; temp2 = rand() % 'a' + 32; temp3 = rand() % 'a' + 32; temp4 = rand() % 'a' + 32; temp5 = rand() % 'a' + 32; cout << temp1 << temp2 << temp3 << temp4 << temp5; system("cls"); }
cout << temp1 << temp2 << temp3 << temp4 << temp5;
return 0; }
Эта код должен "искать" каждый символ, пока не найдет нужный. Но как бы это всё в унисон организовать... Можно напичкать циклами, каждый из которых ищет свой символ по очереди, но это долго, потому что оригинальное слово другое и большое. Сейчас даже не представляю, как заставить перебирать все символы подряд, а так же, останавливая перебор символа, когда он найден, продолжая искать другие.


Ответ

Так вам надо зрелищ или подбор? Подбор - все символы начинаются с a и идут, меняясь одновременно, пока не будет получен нужный...
#include #include #include
using namespace std;
int main(int argc, const char * argv[]) { string res = "Qwertyui"; string att = "AAAAAAAA"; for(;res != att;) { cout << att << '
'; for(int i = 0; i < att.length(); ++i) if (att[i] != res[i]) att[i]++; std::this_thread::sleep_for(200ms); // задержка для зрелищности :) } cout << att << endl; }

Как писать join без select в MYSQL?

Пошёл на собеседование, задали такой вопрос: "как писать join без select". По-моему так не возможно, естественно я писал select ... И в то же время сказали, что неправильно, если это возможно писать. Покажите пример, пожалуйста.


Ответ

Например так:
UPDATE TABLEA a JOIN TABLEB b ON a.join_colA = b.join_colB SET a.columnToUpdate = [something]

PHP. Работа с регулярными выражениями

Есть строка:
[club 88888| ****] текст 2 [club 88888| ****]текст 3
Надо убрать все содержимое скобок вместе с ними
Использую регулярное выражение [.*?]+, но выделяются только звездочки.
Подскажите.


Ответ

Вы не экранируете скобки, правильнее будет сделать вот так:
$string = '[club 88888| ****] текст 2'; echo preg_replace('/\[.+\]+\s?/', '', $string);

Ухудшение качества иконки после сборки проекта

Сделал случайную иконку, выглядит она вот так (Скриншот с рабочего стола):

После этого добавил ее в проект, через Проект > Свойства > Ресурсы > Значек и манифест привязал к проекту, на выходе получается exe с такой иконкой:

Наглядное сравнение (слева собранный проект, справа оригинал):

Почему это происходит и как это исправить?


Ответ

Итак, я понял, чем это вызвано. Похоже, что ни PhotoShop с ущербным плагином "ICOFormat.8bi", ни Gimp не сохраняли файлы нормально.
С помощью Axialis IconWorkshop я смог нормально конвертировать файл в ico и потом вставить в программу. Вот результат:

Первая - изначальная, вторая - сконвертированная при помощи Axialis IconWorkshop, третья - уже exe файл.

Как повернуть треугольник к новой нормали?

Жил был треугольник и была у него нормаль, но вот однажды нормаль изменила ему и стала смотреть в другую сторону, на совсем другой вектор.
Погоревал треугольник 1мс и решил тоже повернутся чтоб зажили они как и прежде.
Задачка: Как повернуть треугольник к его нормали? что бы жили они долго и по перпендикулярному?


Ответ

выбираем нулевую вершину треугольника A за базовую точку откладываем от неё произвольный вектор, перпендикулярный новой нормали и с длиной вектора AB вычисляем вектор AD , перпендикулярный N и AB', как их векторное произведение находим вектор AC' как линейную комбинацию AB' и AD, обеспечивающую нужную длину AC и угол AC'B'
Для других вариантов постановка задачи не обеспечивает достаточно данных.