Страницы

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

пятница, 15 февраля 2019 г.

Рисование на Canvas WPF

Делаю рисовалку на WPF, рисую Line на Canvas, но получается не совсем так, как ожидалось.
Вот часть, которая отвечает за рисование линии:
private void Canvas1_OnMouseMove(object sender, MouseEventArgs e) { if (e.MouseDevice.LeftButton == MouseButtonState.Pressed) { Canvas1.Children.Add(new Line { X1 = e.GetPosition(Canvas1).X, Y1 = e.GetPosition(Canvas1).Y, X2 = e.GetPosition(Canvas1).X + 1, Y2 = e.GetPosition(Canvas1).Y + 1, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round, StrokeThickness = 1, Stroke = Brushes.Black }); } }
Но не получается плавной линии.

Какие у меня есть ошибки в коде? Как сделать плавное рисование?


Ответ

Вы каждый раз рисуете линию длинной один пиксель со смещением по координате X и Y.
То есть, буквально, из точки с координатами {1:1} в точку {2:2}. Это очевидно из приведённого рисунка - все линии идут под углом 45 градусов.
Вам же нужно рисовать линию, которая начинается из конца предыдущей нарисованной. Запоминайте, где была нарисована последняя точка и рисуйте линию до текущей.

C++, C и функция abs

Есть, значит, код:
#include
int main() { std::cout << abs(4.1) << std::endl; return 0; }
(Специально показал инклюды, тут нет cmath).
Под рукой был лишь Windows.
Собираем с компилятором от Microsoft. Вывод:
4.1
Собираем с g++ (MinGW). Вывод:
4
Окей, ничего не понятно.
Подключим-ка . Ничего не меняется...
Подключаем . Теперь все в порядке на обоих компиляторах.
Хорошо. Будем думать, что по-дефолту каким-то боком используется c-шная abs, оперирующая интами (для g++). Переписываем код:
#include
int main() { std::cout << fabs(4.1) << std::endl; return 0; }
Вывод cl:
4.1
Вывод g++:
А фиг вам, подключить не хотите-ли?
Вывод g++ (после подключения ):
4.1
Ура!
Так вот, скажите:
Почему я могу использовать abs, ничего для этого не подключая - мне понятно. У меня включен , а значит - и . Но из-за чего такие различия для разных компиляторов? Такое чувство, что компилятор от майкрософт где-то подключает ...
Да, кстати. Вопрос именно про использование c-функций abs. С std::abs я проблем не замечал.


Ответ

Ваш код нерабочий в обоих случаях, так как в нем (1) идут попытки использовать эффекты от непрямого включения заголовочных файлов (2) идут попытки использовать нестандартные функции. Эффекты могут рандомно различаться как у разных компиляторов, так и у одного компилятора с разными настройками. Вот например перегрузка ::std::abs(double начиная с C++17 есть в заголовочном файле , но перегрузки ::abs(double при этом там может и не быть.

Самоприсваивание переменной при определении

Встретил в коде участок следующего вида:
int a = a;
компиляция проходит успешно. Вопрос - Как это работает?


Ответ

N1256 6.2.1/7
Any other identifier has scope that begins just after the completion of its declarator .
То есть область видимости имени переменной начинается сразу после declarator. В Вашем случае в инициализаторе имя уже видно и может быть использовано. Это значит, что Вы можете инициализировать переменную саму собой, соответственно при этом она получит неопределенное значение.
К слову, в C++ действует такое же правило, и это значит, что возможно скопировать еще неинициализированный объект:
Some s1 = s1; std::string s1 = s2;
Если (и, как правило), конструктор копирования никак не обрабатывает "самокопирование", то объект после такой "инициализации" будет пребывать в неопределенном состоянии.

Почему оператор delete не удаляет локальную переменную внутри функции?

var output = (function(x){ delete x; return x; })(0);
console.log(output);
Вопрос в следующем - почему x не удаляется, ведь оно является свойством arguments?


Ответ

Оператор delete может удалять только свойства объекта:
delete эффективен только применительно к свойствам объектов. Он не оказывает никакого влияния на имена переменных и функций.
Источник
А поскольку x является записью Declarative Environment Record (очень грубо говоря - не является свойством объекта, а просто переменной), то и удалить переменную таким образом нельзя.
Более того, даже не всякое свойство объекта можно удалить при помощи оператора delete (и я сейчас не о дескрипторах свойств, хотя это и самое очевидное). Например, нельзя удалить свойство глобального объекта, определенное не явно, а как переменная. Например:
var a = 1; console.log(a === this.a); // `a` является свойством глобального объекта delete a; //false console.log(a); // 1
Однако:
this.a = 1; console.log(a === this.a); // все еще равны delete a; // true console.log(a); // error

Из комментариев
А разве x не является свойством псевдо-массива arguments?
Разумеется, является.
"use strict"; (function(x){ console.log(arguments[0]); delete arguments[0]; console.log(arguments[0]); console.log(x); // все еще есть! }(0));
Но поскольку удалить можно только свойство объекта, то и обращаться нужно непосредственно к свойству объекта. Однако при помощи такого подхода вы и удалите только свойство объекта. А, поскольку локальные переменные (точнее говоря, формальные параметры функции) никак не связаны с объектом arguments, то формальный параметр x по-прежнему доступен (именно как локальная переменная, но не как свойство arguments).

Массив localStorage не сохраняет данные, если сделать refresh страницы

Есть форма, в нее пользователь вписывает данные и они сохраняются в localStorage массиве под названием todo. Данные вписанные в форму оказываются в ul li списке. Я проверяю в консоли и они действительно добавляются в массив todo, но после обновления страницы данные исчезают из списка li пропадает и из массива todo тоже. Я думаю проблема либо в самом начале кода, где создается массив, либо в dataObjectUpdated(). Вопрос - как сделать, так чтобы данные сохранялись в массиве и refresh страницы на них не влиял. Решение желательно на чистом js
var content = { todo: [], completed: [], uncompleted: [] }; var create = localStorage.setItem('todoList', JSON.stringify(content)); var data = JSON.parse(localStorage.getItem('todoList')); var button = document.getElementById('button'); button.onclick = function() { var input = document.getElementById('input').value; if (input) { addItem(input); } }; var input = document.getElementById('input'); input.onkeypress = function(e) { if (e.keyCode === 13) { button.click(); return false; } }; renderTodoList(); function renderTodoList() { for (var i = 0; i < data.todo.length; i++) { var value = data.todo[i]; addItemToDOM(value); } } function addItem(value) { addItemToDOM(value); // функции нет (для экономии места) document.getElementById('input').value = ''; data.todo.push(value); dataObjectUpdated(); } function dataObjectUpdated() { localStorage.setItem('todoList', JSON.stringify(data)); }

ToDoList



    Ответ

    Проследите логику того, что делается в этих трех строчках:
    var content = {todo:[], completed:[], uncompleted:[]}; var create = localStorage.setItem('todoList', JSON.stringify(content)); var data = JSON.parse(localStorage.getItem('todoList'));
    Вы создаете пустой content, сохраняете его в localStorage и тут же читаете оттуда в data
    Вот как надо:
    var data = {todo:[], completed:[], uncompleted:[]}; var stored = localStorage.getItem('todoList'); if (stored) data = JSON.parse(stored);

    Переход между TextBox WPF

    Есть два TextBox:

    Через PreviewKeyDown происходит перемещение курсора из одного TextBox в другой после нажатия кнопки "пробел":
    private void Cell21_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Space) Cell22.Focus(); } private void Cell22_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Space) Cell21.Focus(); }
    При нажатии "пробел", курсор перемещается в TextBox и добавляет пробел.
    Можно ли как-то удалять этот пробел сразу после того, как курсор переместился?


    Ответ

    Пометьте событие в обработчиках как отработанное сразу после задания фокуса:
    private void Cell1_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Space) Cell2.Focus(); e.Handled = true; } private void Cell2_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Space) Cell1.Focus(); e.Handled = true; }

    Последовательная задержка на Sass для дочерних элементов?

    Всем привет! Как с помощью Sass создать из этого более изящное решение для последовательного увеличения transition-delay у дочерних элементов?
    Вот, чтобы как в примере ZOE - последовательно показывались иконки соц.сетей. Пример - пункт Zoe
    .myClass { &:nth-child(1) { transition: all 1s ease-out 0.5s; } &:nth-child(2) { transition: all 1s ease-out 0.7s; } &:nth-child(3) { transition: all 1s ease-out 0.9s; } &:nth-child(4) { transition: all 1s ease-out 1.1s; } &:nth-child(5) { transition: all 1s ease-out 1.3s; } }


    Ответ

    В Sass существует директива управления - @for. Её можно использовать для таких задач. (Рабочий пример на Codepen.io).
    Sass
    //Создаём переменные для управления значениями $items: 4 $transition: 500ms
    //Каждому элементу будет прибавлять по 0.060s @for $i from 0 through $items &:nth-child(#{$i + 1}) transition-delay: $transition+(60ms*($i))
    Компилированная версия:
    * { margin: 0; padding: 0; } .wrapper { width: 100%; display: flex; justify-content: center; align-items: center; } .wrapper:hover .item { transform: translateY(50px); background-color: crimson; } .item { width: 100px; height: 100px; background-color: tomato; transition: 500ms; } .item:nth-child(1) { transition-delay: 500ms; } .item:nth-child(2) { transition-delay: 560ms; } .item:nth-child(3) { transition-delay: 620ms; } .item:nth-child(4) { transition-delay: 680ms; } .item:nth-child(5) { transition-delay: 740ms; }


    Настройка проекта Visual Studio 2017

    При создании проекта на С# студия автоматически вставляет следующий код:
    using System;
    namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }
    Как этот код можно видоизменить, например чтобы функция Main не принимала никаких параметров.
    Или например как можно сделать, чтобы при создании нового класса студия автоматически добавляла конструктор по умолчанию для класса?


    Ответ

    Каждый проект, который вы добавляете в решение - он создаётся из определённого шаблона и вы можете создать свой собственный шаблон.
    Для этого создайте пустой проект, отредактируйте его так, как вам будет нужно - а после этого в меню File нажмите Export Template (для VS2015) или запустите мастер из Project - Export Template Wizard (в 2017 версии студии).
    По второй части вопроса (шаблон класса) есть отличный ответ на en so, выберите свою версию IDE.
    Например, для редакции VS 2017 Enterprise см. шаблон:
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs
    Выглядит примерно следующим образом:
    using System; using System.Collections.Generic; $if$ ($targetframeworkversion$ >= 3.5)using System.Linq; $endif$using System.Text; $if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks; $endif$ namespace $rootnamespace$ { class $safeitemrootname$ { } }
    Ссылки по теме:
    Практическое руководство. Создание шаблонов проектов How to: Create Project Templates in VS 2015 How do I edit the Visual Studio templates for new C# class/interface? Переменные в шаблонах

    Потенциальные поля, установка потенциала в матрицу

    Как можно установить в двумерный массив потенциал?
    К примеру я задаю точки (X, Y) в которые нужно установить потенциал, например, хочу в матрице установить потенциал размером 10 в координаты (2, 2) и вот что я ожидаю получить:
    { 2, 4, 6, 4, 2, 4, 6, 8, 6, 4, 6, 8, 10, 8, 6, 4, 6, 8, 6, 4, 2, 4, 6, 4, 2 }
    Т. е. нужно чтобы из данный точки градиентом расходились значения от максимального к минимальному.
    Как это можно сделать красиво? У меня есть лишь нелепые конструкции, которые выглядят ужасно. Можно увидеть пример реализации такой штуки?
    Для наглядности еще вот картинка:

    Здесь установлены 2 точки, со значениями 10 и -10.

    Еще о потенциалах:
    Использование потенциальных полей в сценарии стратегии реального времени (Хабр) Поиск пути: метод потенциальных полей


    Ответ

    Когда начал писать ответ, заметил, что авторский массив «то что ожидаю получить» не совпадает с картинкой. Конкретики в этом вопросе мало. Поэтому приведу две разные версии таких полей.
    1. Общий код
    Общий для обеих версий код:
    #include #include
    #define MAP_WIDTH 30 #define MAP_HEIGHT 30
    void print_map(int* map, int w, int h) { for (int y = 0; y < MAP_HEIGHT; ++y) { for (int x = 0; x < MAP_WIDTH; ++x) { // Вместо нулей печатаем пробелы, чтобы не сломать глаза :) (map[x + y*MAP_WIDTH] == 0) ? printf(" ") : printf("%2i ", map[x + y*MAP_WIDTH]); } putchar('
    '); } }
    <...>
    int main() { int map[MAP_HEIGHT][MAP_WIDTH] = {{0}};
    2. Уменьшение веса точки в зависимости от расстояния до центра
    Вес каждой точки должен уменьшатся по мере удаления от центра. Но как? Если честно, я так и не смог подобрать правило, чтобы веса уменьшались как на картинке. Поэтому предоставлю код для линейного уменьшения весов
    // map - матрица целых чисел, w, h -- его высота и ширина соответственно. // x и y -- координаты центра поля. // start_value -- очевидно, начальное значение. // attenuation_constant -- коэффициент затухания.
    void set_potential(int* map, int w, int h, int x, int y, int start_value, int attenuation_constant) { // Вычисляем максимальное удаление от центра по вертикали/горизонтали. int verical_and_horizontal_steps_nm = start_value / attenuation_constant;
    int box[2][2] = { {x - verical_and_horizontal_steps_nm + 2, y - verical_and_horizontal_steps_nm + 2}, {x + verical_and_horizontal_steps_nm - 1, y + verical_and_horizontal_steps_nm - 1} };
    for (int dot_y = box[0][1]; dot_y < box[1][1]; ++dot_y) { for (int dot_x = box[0][0]; dot_x < box[1][0]; ++dot_x) { // Считаем расстояние до точки по формуле d = sqrt((x0-x1)^2 + (y0-y1)^2). int distance = sqrt((x-dot_x)*(x-dot_x) + (y-dot_y)*(y-dot_y));
    // Значение текущей точки меняется линейно. int dot_value = start_value - distance * attenuation_constant;
    // Если точка не лежит на вертикали или горизонтали от центральной мы считаем // значение по-другому, т. к. диагональ квадрата всегда больше его стороны. // Т. к. длина стороны у нас -- 1, то длина диагонали будет sqrt(2). if (dot_y != y && dot_x != x) dot_value = start_value - round(sqrt(2) * distance * attenuation_constant);
    // Чтобы не было отрицательных коэффициентов по углам добавляем условие. map[dot_x + dot_y*MAP_WIDTH] = dot_value > 0 ? dot_value : 0; } } }
    Вот вывод для set_potential((int*)map, MAP_WIDTH, MAP_HEIGHT, 15, 15, 10, 2)
    2 2 4 2 2 2 4 4 6 4 4 2 2 4 7 8 7 4 2 4 6 8 10 8 6 4 2 4 7 8 7 4 2 2 4 4 6 4 4 2 2 2 4 2 2
    Не очень похоже на картинку, зато веса зависят непосредственно от расстояния до центра.
    3. Даже не знаю, как назвать вариант. Смотрите сами…
    Если мы получше рассмотрим левую нижнюю (а вообще, любую) четверть картинки или массив «ожидания» автора, то заметим, что
    Все числа, расположенные на одной диагонали, равны; Каждое число на следующей диагонали (при расхождении от центра) ровно на один шаг (я назвал его коэффициентом затухания) больше любого числа на предыдущей диагонали; Длина каждой диагонали больше предыдущей на единицу.
    Сложно объяснить словами, взгляните сами (коэфф. затухания = 2):

    1. 10 (- 2 = 8) 2. 8 8 (- 2 = 6) 3. 6 6 6 (- 2 = 4) 4. 4 4 4 4 (- 2 = 2) 5. 2 2 2 2 2
    Четыре таких четверти (правильно повернутые) дадут нужную картинку (которая, кстати, является ромбом, что и нужно автору (см. комментарии к вопросу)).
    Алгоритм рисования очень простой, думаю, все будет понятно из кода:
    void set_potential2(int* map, int w, int h, int x, int y, int start_value, int attenuation_constant) { // Заполняем центр. map[x + y*MAP_WIDTH] = start_value;
    // Вычисляем максимальное удаление от центра по вертикали/горизонтали. int verical_and_horizontal_steps_nm = start_value / attenuation_constant;
    // Здесь i -- расстояние от центра до текущей точки. for (int i = 1; i < verical_and_horizontal_steps_nm; ++i) { int dot_value = start_value - attenuation_constant * i;
    // Заполняем левый нижний угол: // // dot_y = y+i -- переходим в точку максимального отдаления по вертикали от центра. // dot_x = x -- координата x точки равна координате центра. // do_y >= y; --dot_y -- пока находимся выше центра, поднимаемся вверх. // --dot_x -- смещаемся влево. // // Т. е. мы как-бы по ступенькам поднимаемся вверх-влево, вверх-влево, вверх-влево... // Для остальных углов меняем только направления в заголовке цикла. for (int dot_y = y+i, dot_x = x; dot_y >= y; --dot_y, --dot_x) // Тоже самое, что map[dot_x][dot_y] map[dot_x + dot_y*MAP_WIDTH] = dot_value;
    // Правый нижний угол for (int dot_y = y+i, dot_x = x; dot_y >= y; --dot_y, ++dot_x) map[dot_x + dot_y*MAP_WIDTH] = dot_value;
    // Левый верхний угол for (int dot_y = y-i, dot_x = x; dot_y <= y; ++dot_y, --dot_x) map[dot_x + dot_y*MAP_WIDTH] = dot_value;
    // Правый верхний угол for (int dot_y = y-i, dot_x = x; dot_y <= y; ++dot_y, ++dot_x) map[dot_x + dot_y*MAP_WIDTH] = dot_value; } }
    Вот что выдает алгоритм при set_potential2((int*)map, MAP_WIDTH, MAP_HEIGHT, 9, 9, 10, 2)
    2 2 4 2 2 4 6 4 2 2 4 6 8 6 4 2 2 4 6 8 10 8 6 4 2 2 4 6 8 6 4 2 2 4 6 4 2 2 4 2 2

    Автор привел обрезанный массив:
    { 2, 4, 6, 4, 2, 4, 6, 8, 6, 4, 6, 8, 10, 8, 6, 4, 6, 8, 6, 4, 2, 4, 6, 4, 2 }
    Обрежем наш результат:
    2 4 6 4 2 4 6 8 6 4 6 8 10 8 6 4 6 8 6 4 2 4 6 4 2
    Сходство налицо. Думаю, это именно то, что нужно было автору. По-моему, красота :)
    P. S. Код не очень, конечно, но для иллюстрации идеи — пойдет.
    P. S. S. Если честно, не знаю как правильно перевести «коэффициент затухания»: «attenuation constant» или «damping constant». Если кто исправит, будут признателен.

    Управление частотным диапазоном тега audio [Javascript]

    Всем хамончика! Ничего не искал пока по этому поводу, но стало интересно: возможно ли на JavaScript (чистом, без библиотек и говнофреймворков) изменять частотный диапазон аудио файла? Эдакий аналог эквалайзера. Задавать ширину диапазона начиная от частоты (low pass, high pass, low shelf, high shelf и bell частотные диапазоны) и уровень громкости этого диапазона?


    Ответ

    Частотный фильтр для эквалайзера можно создать без библиотек, фреймворков и даже без Web Audio API. В основе может лежать алгоритм на примере алгоритма Paul Kellett. В данном случае аудиофайл выбирается на компьютере. Можно задавать частоту выделения и степень резонанса. WebAudioAPI тут используется только для того, чтобы получить исходные семплы выбранного файла, без этого никуда не деться.
    Минусы этого примера - успешно обрабатываются в основном маленькие файлы, большие требуют длительного декодирования семплов и тогда может подвиснуть браузер. Обработка происходит не в реальном времени. Код работает пока только со стереоаудиофайлами.
    var samples = [[], []]; // массив, в котором будут семплы обработанного аудио var f = 0.15; // частота выделения (в пределах от 0 до 1) в данном случае около двух килогерц. var q = 0.95; // степень резонанса (в пределах от 0 до 1) var volume = 5000; // громкость. нужно подбирать, учитывая подъём выделенной частоты var titlestring = decodeURIComponent(escape(window.atob("UklGRgAAAABXQVZFZm10IBAAAAABAAIARMKsAAAQwrECAAQAEABkYXRh"))); var title = []; for(i = 0; i < titlestring.length; i++)title[i] = titlestring.charCodeAt(i); var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); var source = audioCtx.createBufferSource(); myfile.onchange = function(){ var reader = new FileReader(); reader.readAsArrayBuffer(this.files[0]); reader.onload = function(e){ audioCtx.decodeAudioData(e.target.result, function(buffer){ var data_L = buffer.getChannelData(0); // получаем исходные семплы var data_R = buffer.getChannelData(1); // аудиофайла с помощью Web Audio API var buf0 = buf1 = buf2 = buf3 = 0; for(i=0; i < data_L.length; i++){ var fb = q + q / (1.0 - f); buf0 += f * (data_L[i] * volume - buf0 + fb * (buf0 - buf1)); buf1 += f * (buf0 - buf1); buf2 += f * (data_R[i] * volume - buf2 + fb * (buf2 - buf3)); buf3 += f * (buf2 - buf3); samples[0][i] = buf1; // получаем уже обработанные семплы samples[1][i] = buf3; // аудиофайла без Web Audio API } var outfile = new Int16Array(title.length / 2 + samples[0].length * 2); for(i=0; i < title.length; i += 2)outfile[i / 2] = title[i] + title[i + 1] * 256; for(i=0; i < samples[0].length * 2; i++){ outfile[i * 2 + 44] = samples[0][i]; outfile[i * 2 + 45] = samples[1][i]; } audio.src = URL.createObjectURL(new Blob([outfile])); audio.play(); // играем и наслаждаемся audio.currentTime = 0; }); } }


    Как в Visual Studio 2017 поменять цвет полей класса

    Как в Visual Studio 2017 поменять подсветку цвета идентификаторов полей класса для проектов С#?
    Для проектов на С++ есть отдельная опция для изменения цвета (второй скрин), для C# такую опцию не могу найти.


    Ответ

    Стандартное решение
    Для изменения цветов в Visual Studio существует специальный раздел "Шрифты и цвета". Находится он в "Среда" -> "Параметры" -> "Окружение" -> "Шрифты и цвета".
    К примеру, хотим мы изменить указанный вами текст на красный:
    В "Шрифты и цвета" выбираем в выпадающем списке "Текстовый редактор". Ищем в нижнем списке "Идентификатор". Сбоку от списка есть настройки цвета, а также опции для изменения шрифта. К примеру в "Основной цвет элемента" выбираем "Красный". Жмем кнопку ОК.
    Результат:

    p.s. Но тут одно но! Стандартно студия для языка c# покрасит вам все названия в один цвет (будь они локальные или нет).
    Решение на основе ReSharper
    Для начала активируем опцию, которая переключит цвета в редакторе на те, что предоставляет ReSharper. Для этого заходим в настойки ReSharper "Code Inspector" -> "Settings" -> "Color identifiers".

    Далее идем в уже знакомые нам настройки студии, в раздел "Шрифты и цвета". Нас интересует "ReSharper Field Identifier", ставим ей текст на красный.
    Результат:

    На просторе интернета есть еще пару плагинов, которые помогут в решение этой задачи, один из таких SemanticColorizer, но я с ними не знаком...

    Как изменить текст всплывающего предупреждения required pattern?

    В хроме так:
    В разных браузерах текста предупреждений отличаются


    Ответ

    Можно задать свое сообщение, в зависимости от типа ошибки. В каждом input содержится специальный объект validity, включающий в себя список булевых значений(true или false), характеризующих ту или иную проверку на валидность. Список свойств этого объекта с описанием на русском языке: https://htmlacademy.ru/blog/95-form-validation-techniques
    $('input').on('input invalid', function() { this.setCustomValidity('') if (this.validity.valueMissing) { this.setCustomValidity("Нет значения") } if (this.validity.typeMismatch) { this.setCustomValidity("Не соответствует типу") } if (this.validity.patternMismatch) { this.setCustomValidity("Не соответствует паттерну") } })


    Как правильно произвести замену img на svg?

    Есть изображение img svg, которое вставлено на страницу с помощью тега img

    Задача: изменить fill для данного изображения
    Как вариант сделать замену inline img на svg
    Может есть другие варианты решения данной задачи?


    Ответ

    Хорошее, но большое решение задачи:
    jQuery('img.svg').each(function() { var $img = jQuery(this); var imgID = $img.attr('id'); var imgClass = $img.attr('class'); var imgURL = $img.attr('src'); jQuery.get(imgURL, function(data) { // Get the SVG tag, ignore the rest var $svg = jQuery(data).find('svg'); // Add replaced image's ID to the new SVG if (typeof imgID !== 'undefined') { $svg = $svg.attr('id', imgID); } // Add replaced image's classes to the new SVG if (typeof imgClass !== 'undefined') { $svg = $svg.attr('class', imgClass + ' replaced-svg'); } // Remove any invalid XML tags as per http://validator.w3.org $svg = $svg.removeAttr('xmlns:a'); // Check if the viewport is set, if the viewport is not set the SVG wont't scale. if (!$svg.attr('viewBox') && $svg.attr('height') && $svg.attr('width')) { $svg.attr('viewBox', '0 0 ' + $svg.attr('height') + ' ' + $svg.attr('width')) } // Replace image with new SVG $img.replaceWith($svg); }, 'xml'); }); svg path {fill: #000 !important;}
    Очень давно сталкивался с данной задачей, когда проще прикреплять svg в img во благо меньшего количества строк кода, но тогда ты не имеешь прямого доступа в изменению цвета через svg path{fill: value}, но метод выше более чем рабочий, если вы не брезгуете jQuery

    Расстояние между item в ListView

    Как изменить расстояние между item в listview


    Ответ

    Попробуйте так:

    те вы создаете пустой разделитель высотой в 8dp, тем самым раздвигая элементы списка. У этого способа есть возможный плюс, он будет работать даже при разных item в 1 списке.

    Как изменить по событию hover , path в svg?

    Собственно сам вопрос в заголовке

    Имеется такой hexagon а svg и в соответствии с макетом на нём должен произойти hover и по этому событию должно произойти увеличение тёмного элемента, я всё сделал за исключением hover
    Как мне раньше объясняли что должно быть одинаковое ко-во точек и именно это условие я предусмотрел ..
    Как в этом случае сделать так что бы было как во втором hexagon ?


    Ответ

    #pouring { transition: 1s; } #hexagon:hover #pouring { d: path("m 85.620408,182.81115 0.753717,-46.40922 46.976195,-22.64163 46.22247,23.76759 -0.75372,46.40922 -46.97619,22.64164 z"); d: "m 85.620408,182.81115 0.753717,-46.40922 46.976195,-22.64163 46.22247,23.76759 -0.75372,46.40922 -46.97619,22.64164 z"; transform: translate(-55px, -17px); }

    Любое количество любых символов

    Как, используя регулярные выражения задать паттерн вида :
    Начало ... конец ,
    где ... это любые символы включая пробелы, тире подчеркивания и целые числа причем сколько их неизвестно. Я пытаюсь сделать это так :
    var pattern = new Regex(@"Start:\S*\s*End");
    т.к. \S* - ноль или более символов не яв-ся пробелом а \s* - ноль или более символов являющихся. Однако это неправильно. Как исправить ?


    Ответ

    Используйте
    var pattern = new Regex(@"Start:.*?End", RegexOptions.Singleline);
    Подробности
    Start: - начальный разделитель .*? - 0 и более любых символов, как можно меньше (*? — ленивый квантификатор) End - конечный разделитель RegexOptions.Singleline - флаг, благодаря которому находит все символы, даже символы перевода строки.
    Сининимические конструкции:
    var pattern = new Regex(@"(?s)Start:.*?End"); var pattern = new Regex(@"Start:(?s:.*?)End");
    Однако, если необходимо найти подстроку, в которой не должно быть разделителей, нужно использовать "умеренно жадный токен" (tempered greedy token):
    var pattern = new Regex(@"(?s)Start:(?:(?!Start:).)*?End"); ^^^^^^^^^^^^^^^^
    Этот шаблон в строке Start: 1, Start: 2, End: 56 найдет Start: 2, End, а не Start: 1, Start: 2, End

    Когда следует использовать inline для функции/метода?

    Перевод вопроса: https://stackoverflow.com/q/1759300/5697743
    Когда мне следует использовать ключевое слово inline для функции или метода в C++?
    После просмотра различных объяснений возникли вопросы:
    Когда мне не следует использовать ключевое слово inline для функции или метода в C++? Когда комилятор не знает, что нужно сделать функцию 'встроенной'? Отразится ли как-либо использование многопоточности в приложении на работе inline?


    Ответ

    inline ближе к static или extern, чем к указанию компилятору встроить ваши функции. extern, static и inline используются в основном линковщиком, а не компилятором.
    Иногда пишут, что inline указывает компилятору, что по-вашему функция должна быть встроенной. Это было правдой и имело смысл в 1998 году, но спустя двадцать лет компилятору больше не нужны такие подсказки. Не стоит и говорить, что люди часто ошибаются, когда дело доходит до оптимизации кода, так что большинство компиляторов прямо игнорируют такие "подсказки".
    static - имя функции/переменной не может быть использовано в других единицах трансляции. Линковщик должен убедиться, что это случайно не сделано. extern - использовать это имя в данной единице трансляции, но не жаловаться, если оно не определено. Линковщик разберётся и убедится, что у каждого символа есть адрес. inline - эта функция будет определена в разных единицах трансляции, игнорировать это. Линковщик должен убедится, что все единицы трансляции используют один и тот же экземпляр.
    Примечание: В целом, определение шаблонов с inline бессмысленно, потому что они уже используют семантику линковки, аналогичную предоставляемой inline. Однако, для явной (explicit) специализации и инициализации шаблонов требуется использовать inline

    Ответы на ваши вопросы:
    Когда мне следует использовать ключевое слово inline для функции или метода в C++?
    Только когда вы хотите определить функцию в заголовке. Точнее, когда более одного определения функции встречается в различных единицах трансляции. Будет хорошей идеей поместить маленькие (однострочные) функции в заголовок, так как это даст больше информации для оптимизации компилятору. Однако, это увеличит время сборки. Когда мне не следует использовать ключевое слово inline для функции или метода в C++?
    Не используйте inline только из-за уверенности, что ваш код заработает быстрее. Когда компилятор не знает, что нужно сделать функцию 'встроенной'?
    В целом, компилятор умеет выполнять такую оптимизацию лучше вас. Однако, он не сможет это сделать, если нет определения функции (в данной единице трансляции). Как правило, в максимально оптимизированном коде все private методы встраиваются, просили вы того, или нет. Для предотвращения встраивания в GCC используйте __attribute__(( noinline )), а в Visual Studio - __declspec(noinline) Отразится ли как-либо использование многопоточности в приложении на работе inline?
    Многопоточность не влияет как на работу inline, так и на встраивание функций.

    Текущий поток должен быть задан как поток однопоточного контейнера

    Как-то через раз появляется ошибка:
    Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны. Проверьте, что ваша функция Main помечена атрибутом STAThreadAttribute.
    Что это значит и как исправить? И почему она выскакивает не всегда?
    using System; using System.IO; using System.Net; using System.Text;
    public class Program { public static void Main() { try { TextReader file_track_title = new StreamReader(@"C:\Users\Administrator\Desktop\AMData\track_title.txt");
    System.Windows.Forms.Clipboard.SetText(file_track_title.ReadLine());
    file_track_title.Close(); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } } }


    Ответ

    Thread thread = new Thread(() => Clipboard.SetText(file_track_title.ReadLine())); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join();

    Как сделать такое главное меню? (Wordpress)


    Как можно сделать вот такую волнистую линию у главного меню?


    Ответ

    Можно использовать изображение с куском волны и применить это изображение как фон меню с повторением по координате-x;
    background: url('волна.png') left top repeat-x;
    в качестве изображения можно использовать svg, но тогда необходимо будет указать background-size. Можно использовать svg pattern html,body{margin:0;padding:0;} div{ background: url('https://i.imgur.com/S1DAySp.jpg'); background-size:cover; overflow:hidden; } svg{ display:block; }

    контент

    контент

    контент

    контент

    контент

    Недопонимание с Linux на примере демона.

    Чтобы создать демона (по крайней мере в Linux), то нужно предпринять ряд событий, которые я сейчас опишу. В конце вопросы, если кто-то разбирается, то просьба овтетить, буду признателен.
    1) Нужно вызвать функцию fork() для создания дочернего процесса и завершить родительский процесс. Это делается для того, чтобы наш дочерний процесс запутился в фоновом режиме (если не прав, то поправляйте)
    if( (pid = fork()) < 0) return -1; else if(pid) exit(0);
    2) Затем мы вызываем функцию setsid(), которая создает новый сеанс. К тому же, вызывающий процесс становится ведущим в группе, ведущим процессом нового сеанса и не имеет контролирующего терминала.
    if(setsid() < 0) return -1;
    В книге "Разработка сетевых приложений" Стивенс У.Р, откуда я и беру этот пример, автор вызывает еще один раз функцию fork(), для того, чтобы гарантировать, что демон не сможет автоматически получить управляющий терминал, когда будет открывать устройство терминала. Заметьте, что при завершении родительского процесса (в нашем случае первого дочернего процесса), посылается всем процессам в сеансе (в том числе и нашему второму дочернему процессу) сигнал SIGHUP (when someone kills the terminal, without killing app running inside of termiтal window, OS sends the signal to the program), который нам нужно игнорировать.
    3) Производим смену текущего каталога командой chdir("/");
    4) Закрываем дескрипторы файлов. Автор делает это таким образом
    for(i = 0; i < 64; i++) close(i);
    И дальше больше... Остальной код приводить не буду, так как он не относится к сути вопросов, но в интеренете есть книга, которую я указал ранее, где вы можете найти пример полностью.
    Собственно говоря, мои вопросы
    1) Вопрос может показаться глупым, но я не совсем понимаю, что означает управляющий терминал. Это что-то вроде терминала из под root? Объясните, пожалуйста, что это и что он делает.
    2) Зачем нужно менять текущий каталог? В книге об этом сказано мало и мне не совсем понятно
    3) За что отвечают дескрипторы, которые мы закрываем? И нужно ли их вообще закрывать?


    Ответ

    Вопрос может показаться глупым, но я не совсем понимаю, что означает управляющий терминал. Это что-то вроде терминала из под root? Объясните, пожалуйста, что это и что он делает.
    Если кратко, то это терминал связанный с текущей консольным сеансом (session). Указан в частности в столбце TTY ps'а. По факту он эквивалентен одному из устройств /dev/tty* для «настоящей» консоли или /dev/pts* для псевдотерминалов (unix98). Также есть специальное устройство /dev/tty, ссылающееся на управляющий терминал (controlling terminal) текущего процесса.
    Основное назначение этой абстракции — переключение между группами процессов — только одна из которых может быть на переднем плане (foreground), а остальные в фоне (background). Также УТ (находясь в каноническом режиме) отвечает за посылку сигналов процессам находящимся на переднем плане при появлении на входе специальных символов (например ^C или ^Z) . Кроме того с помощью УТ программы могут запрашивать непосредственно у пользователя какие-то данные, например пароль, когда ввод/вывод перенаправлен, так в частности поступают ssh или sudo
    Вообще говоря, в UNIX управление заданиями, да и всей подсистемы связанной с терминалами, — довольно запутанная вещь со множеством мелких и крупных кочек, большинство из которых навеяно историей и необходимостью сделать всё гибко, но в то же время чисто, так что описание назначения и деталей УТ, а также таких абстракций, как «группа процессов», «сессия», «лидер сессии» итд, заслуживают отдельной главы в книге или хотя бы статьи
    2) Зачем нужно менять текущий каталог? В книге об этом сказано мало и мне не совсем понятно
    В принципе это не обязательно, но является хорошей практикой освобождать неиспользуемые ресурсы. Например, если это не сделать, то нельзя будет отмонтировать ФС с каталогом откуда пользователь запустил демона.
    3) За что отвечают дескрипторы, которые мы закрываем? И нужно ли их вообще закрывать?
    То же что и предыдущее, не обязательно, но обычно является хорошей практикой. Первые три — это стандартные потоки ввода/вывода/ошибок, а остальные — другие дескрипторы, которые могут быть открыты — различные сокеты, файлы итп.
    К сожалению, в POSIX нет простого и переносимого способа, который позволяет просто «закрыть все открытые дескрипторы» или хотя бы «запросить все открытые д.», поэтому обычной практикой является перебирать их все подряд, от нулевого до последнего и закрывать. Да, более переносимым вариантом, не полагающийся на магическую константу «64», будет:
    for(int fd=0, maxfd=sysconf(_SC_OPEN_MAX); fdВ BSD-мире есть довольно удобный вызов closefrom (), который закрывает все дескрипторы выше указанного. В некоторых системах есть аналогичный вызов fcntl — F_CLOSEM
    На Linux и некоторых других системах вместо этого можно посмотреть содержимое /proc/self/fd (или /dev/fd/*) и закрыть только действительно открытые.
    Другие замечания по этому зоопарку расписаны здесь. Реальный пример поддержки различных систем с тоннами условной компиляции можно посмотреть, например, в openssh
    Кроме того первые три дескриптора (stdin, stdout, stderr) стоит переоткрыть, например, на /dev/null, дабы избежать ошибок в дальнейшем.
    Другие замечания
    Алгоритм «демонизации», опустив обработку ошибок и прочее, можно записать в 4 строчки. Причём непосредственно к демонизации относится только первая, и частично вторая, а остальные — лишь желательная подчистка.
    if( fork() ) exit (0); // Собственно демонизация setsid (); // отвязка от управляющего терминала if( fork() ) exit (0); // самозащита, чтобы случайно не подцепить новый УТ во время работы cleanup_everything (); // различная очистка и освобождение всех не нужных ресурсов

    Язык C, локальные автоматические массивы

    Никогда не думал, что для локального автоматического массива справедливо следующее:
    void func(void) { char arr[10]; if (arr == &arr) { // Всегда истина, по крайней мере, при использовании компилятора MinGW. } }
    Подскажите, Стандарт что-нибудь говорит об этом, или это не более, чем совпадение?
    Самое интересное во всей этой ситуации, что следующий код корректно работает:
    char arr[10]; scanf("%10s", &arr);
    И я уже было предположил, что компилятор тихо опускает операцию взятия адреса (&), и &arr преобразуется в arr или, если точнее, в &arr[0].
    Если бы не одно но:
    char arr[10]; char *p = &arr;// Warning, несоответствие типов char **pp = &arr;// Warning, несоответствие типов
    Так что происходит?


    Ответ

    Операция взятия адреса &, примененная к массиву, дает вам адрес всего массива. Нет ничего удивительно в том, что адрес всего массива &arr численно совпадает с адресом нулевого элемента массива &arr[0] (выражение arr в этом контексте эквивалентно &arr[0]). Точно так же адрес первого элемента структуры совпадает с адресом всей структуры. В этом тоже нет ничего удивительного.
    Вот в таком примере вы увидите одинаковые адреса в каждом printf
    #include
    struct S { int a, b, c; };
    int main() { int a[10]; printf("%p %p
    ", (void *) &a, (void *) a);
    struct S s; printf("%p %p
    ", (void *) &s, (void *) &s.a); }
    Причины одинаковости адресов в каждом printf - совершенно идентичные. Почему вас это удивило - не ясно.

    Однако:
    Первый вопрос бессмыслен ибо код некорректен с точки зрения языка С.
    Ограничения на операнды оператора ==
    Constraints 2 One of the following shall hold: — both operands have arithmetic type; — both operands are pointers to qualified or unqualified versions of compatible types; — one operand is a pointer to an object or incomplete type and the other is a pointer to a qualified or unqualified version of void; or — one operand is a pointer and the other is a null pointer constant.
    Ваши операнды имеют типы char * и char (*)[10] и не удовлетворяют вышеприведенным требованиям. Язык С не допускает прямого сравнения указателей типа char * и типа char (*)[10]
    Вы могли бы сравнить if ((void *) arr == (void *) &arr) и действительно получить равенство. Но в этом не ничего удивительного, как сказано выше.

    Код
    char arr[10]; scanf("%10s", &arr);
    не "корректно работает", а порождает неопределенное поведение. Спецификатор формата %s требует аргумента типа char *, а вы передаете char (*)[10]. Поведение не определено.
    Практическую "работоспособность" этот код имеет из-за названной выше причины: адрес первого элемента массива совпадает с адресом всего массива.

    Также по теме скопирую свой ответ отсюда
    char mass[N]; scanf("%s",mass); // так правильно scanf("%s",&mass); // почему-то тоже срабатывает
    Такой вопрос обычно возникает у людей, которые считают, что массив физически представлен неким указателем на некий блок памяти. Соответственно ожидается , что &mas даст нам указатель на этот указатель и не будет работать в scanf. Поэтому работоспособность такого scanf зачастую вызывает удивление.
    На самом деле массивы в языке С не являются и никогда не являлись указателями. Это очень популярная легенда, которая никак не хочет умирать, несмотря на то, что материалов, объясняющих семантику С массивов написано очень много на всех языках.
    Массив - это просто непрерывный блок памяти, содержащий элементы массива. Т.е. например int a[20] - это блок памяти из 20 объектов типа int. И все. Имя a, как объект - это объект типа int [20], который соответствует именно и только этому блок памяти. Никакого указателя там нигде нет.
    Иллюзия того, что массив "является указателем" возникает из-за того, что когда вы используете имя массива в выражениях, то почти всегда к массиву применяется неявное преобразование типа, которое автоматически "на лету" преобразует объект типа "массив" к временному значению "указатель на элемент". Этот указатель является rvalue и нигде не хранится в памяти. Он существует только концептуально - как результат вышеупомянутого неявного преобразования. Это чисто воображаемый указатель.
    По-английски явление "превращения" массива в указатель известно под устойчивым названием "array type decay". В стандарте языка С++ (где ситуация с массивами точно такая же) это неявное преобразование официально называется "array-to-pointer conversion".
    Но это неявное преобразование применяется не всегда. В языке С существует три контекста-исключения, в которых это неявное преобразование не делается:
    Оператор sizeof. Как известно sizeof(array) возвращает размер всего массива, а не размер указателя на элемент. Унарный оператор &. Возвращает указатель типа "указатель-на-весь-массив", а не "указатель-на-указатель" Инициализация массива строковым литералом - char a[] = "Hello";. Литерал "Hello" является массивом , но не деградирует до указателя в данном контексте.
    Таким образом, применение оператора & к объекту типа "массив" дает вам указатель "на весь массив" (с точки зрения типа указателя). Т.е. для int a[20] выражение &a имеет тип int (*)[20]. В памяти адрес "всего массива" - это адрес того самого непрерывного блока, о котором я говорил выше. Т.е. численно этот адрес совпадает с адресом нулевого элемента массива. Именно поэтому выражения &a, &a[0] и просто a численно дают один и тот же адрес.
    Именно поэтому, к примеру, в функцию memcpy для двух массивов (т.е. именно объектов типа "массив", а не "указатель") можно вызывать и как memcpy(dst, src, sizeof src), и как memcpy(&dst, &src, sizeof src) и как memcpy(&dst[0], &src[0], sizeof src). Результат будет один и тот же во всех случаях.
    Именно поэтому правильно работает scanf при использовании mass или &mass, ибо оба выражения дают одно и то же физическое численное значение. (Второй вариант формально не верен, т.к. формат %s требует указателя именно типа char *, а не char (*)[N], но на практике это не важно.)
    Кстати, Денис Ритчи в своей статье об истории происхождения С (http://cm.bell-labs.com/who/dmr/chist.html) пишет, что изначально он собирался реализовать массивы в С точно так же, как они были реализованы в языках B и BCPL. В B и BCPL массивы были реализованы именно как самостоятельные указатели, указывающие на отдельные посторонние блоки памяти. Но Ритчи также хотел ввести в язык такой новый тип, как структуры. И тут сразу возникла проблема: если массив будет реализован через указатель, то структуру, содержащую в себе массивы, невозможно будет тривиально копировать. Т.е. обычный memcpy будет тупо копировать указатели из одной структуры в другую. А это, разумеется, неприемлемо. По этой причине он отказался от идеи реализовывать массивы через физические указатели. Массивы в С стали просто блоками памяти. Никаких указателей. Но для сохранения похожей на B и BCPL семантики в язык С было введено неявное преобразование из типа "массив" в тип "указатель". Большинство операций с массивами работает именно через это преобразование, т.е. через временный указатель. Но физически этого указателя не существует.

    Как перечислить все записи в тегах

    Есть строка '/home/pc/test' , и слова в тегах '[/alseko][/logs][/archive]' Как получить ожидаемый результат =
    [/home/pc/test/alseko][/home/pc/test/logs][/home/pc/test/archive]
    Мой код, пытаюсь найти:
    select '[' || '/home/pc/test' || ltrim(substr('[/alseko][/logs][/archive]', instr('[/alseko][/logs][/archive]', '['), instr('[/alseko][/logs][/archive]', ']')),'[') from dual


    Ответ

    Надо распарсить теги в таблицу, и потом заново собрать в строку, например так:
    with data as ( select '[/alseko][/logs][/archive]' tags, '\[(\/\w+)' pattern, '/home/pc/test' prefix from dual ), tags as ( select '['||prefix||regexp_substr (tags, pattern, 1, level, null, 1)||']' tag, level sort from data connect by level <= regexp_count (tags, pattern) ) select listagg (tag) within group (order by sort) from tags ;
    Вывод:
    [/home/pc/test/alseko][/home/pc/test/logs][/home/pc/test/archive]

    Если все свойства и их значения у объектов одинаковы, то одинаковы ли объекты?

    Извините за наверное глупый вопрос. Не буду вставлять весь код. Вопрос небольшой по фрагменту этому, а то я немного засомневался. greed это массив с объектами и некоторые из них могут быть с абсолютно одинаковыми свойствами и их значениями. При этом условии все ли они попадут в acted? Будет ли интерпретатор воспринимать их как разные объекты?
    World.prototype.turn = function() { var acted = []; this.grid.forEach(function(critter, vector) { if (critter.act && acted.indexOf(critter) == -1) { acted.push(critter); this.letAct(critter, vector); } }, this); };


    Ответ

    Конечно это будут разные объекты.
    var src = [ {d: 5}, {d: 5}, {d: 5} ] var dst = []; for (i = 0; i < src.length; i++) { if (dst.indexOf(src[i]) == -1) dst.push(src[i]); }; console.log(dst);
    При сравнении объектов сравниваются их "указатели". Если нужно сравнивать свойства, то нужно писать свой компаратор

    Автодобавление текстовых партиций

    Цель: Автоматическое добавление новых партиций при добавлении нового текстового значения
    Ситуация: Поступают записи, в одном поле которых есть повторяющееся текстовое значение. На это поле в целевой для этих данных таблице создана партиция. В качестве значения этого поля может прийти новое значение, которого нет в существующих партициях. Возникает ошибка, связанная с отсутствие соответствующей секции. Списком эти партиции не сделать так, как заранее не известны значения, которые могут поступать.
    Вопрос: Можно ли для этого случая организовать автоматическое добавление необходимых секций? Без триггера, только средствами организации таблицы.
    Что то типа такого (выдуманный пример):
    create table char_part ( id integer, txt varchar2(200) ) partition by range (txt) interval (1) -- Проблема в автодобавлении нового текст. значения ( partition "abc" values less than ('abc'), partition "max" values less than (maxvalue) -- Для null - значений )


    Ответ

    TL;DR: В версии 11g это невозможно. Лучшее решение - перейти на 12c, так как в этой версии уже введено автоматическое лист секционирование.

    Можно решить задачу через секционирование по interval появившиеся в 11g. На основе бизнес требований надо продумать, как вычислqть колонку для секционирования. Как например, спроси у Тома.
    Предложение для задачи как в вопросе:
    create table char_part ( id integer, txt varchar2(200), txt# generated always as (coalesce (ora_hash (txt, power (2,20)-1), 0)) virtual ) partition by range (txt#) interval (1) ( partition "empty" values less than (0), partition "undef" values less than (1) );
    insert into char_part (id, txt) select 1, 'ABC' from dual union all select 2, 'DEF' from dual union all select 3, 'ZZZ' from dual union all select 9, null from dual ;
    select table_name, partition_name, high_value from user_tab_partitions where table_name=upper('char_part') ;
    TABLE_NAME PARTITION_NAME HIGH_VALUE ---------- -------------------- ---------- CHAR_PART SYS_P1141 222410 CHAR_PART SYS_P1142 59915 CHAR_PART SYS_P1143 627928 CHAR_PART empty 0 CHAR_PART undef 1

    Заменил в проекте все compile на implementation, но предупреждение осталось!

    Заменил абсолютно все compile на implementation в gradle по рекомендации (предупреждению) Android Studio, но предупреждение (warning) продолжает меня предупреждать:
    Configuration 'compile' is obsolete and has been replaced with 'implementation'


    Ответ

    Обновил
    com.google.gms:google-services 3.1.1
    на
    com.google.gms:google-services 3.2.0
    и все OK! Предупреждений больше нет!

    Кастомизация консольного приложения в Linux

    Пишу консольное приложение в Linux, вот и возникло два вопроса.
    Во-первых, как программно развернуть эмулятор терминала на весь экран? Да, в Windows это делается с помощью Win API, но что делать, к примеру, в Ubuntu?
    Во-вторых, как мне поменять фон в терминале во время исполнения программы? Чтобы у меня стояла не пользовательская тема, а предусмотренная мною?
    Заранее спасибо.


    Ответ

    В Linux нет понятия консольного приложения в смысле Windows.
    Приложение может иметь управляющий терминал, с которым у него связаны дескрипторы стандартного ввода, вывода и вывода ошибок, и от которого могут приходить сигналы. Терминал может быть физическим или виртуальным, в последнем случае он может поддерживать или не поддерживать изменение количества строк и управление положением своего окна в графической среде (если оно вообще есть). И это зависит от программы эмулятора терминала, которых в Linux великое множество и укаждого свои возможности, однако те из них которые запускаются из X-Window, например xterm, обычно поддерживают набор команд VT102, в котором предусмотрено некоторое управление окном через escape-последовательности (ищите dtterm), но обычно оно сокращено или отключено по-умолчанию или вовсе не реализовано. Включить у xterm его можно через X-ресурсы например при запуске эмулятора терминала:
    xterm -xrm 'xterm*allowWindowOps: true'
    Далее в открывшемся окне попробуйте:
    $ printf '\033[3;0;0t' # переместить окно в верхний левый угол $ printf '\033[9;1t' # во весь экран
    Если определена переменная окружения DISPLAY, значит программа запущенна из X-Window, и вы можете запустить свой эмулятор терминала, указав в аргументах нужную конфигурацию и вашу программу в нём. По аргументам см. man xterm, man gnome-terminal, man konsole и т.п.

    Почему элементарный javascript с jsfiddle не работает в локальном монофайле?

    Ни в одном браузере.
    блабла

    Show / Hide

    Ribeye fatback tongue spare ribs cow doner salami short ribs pork chop pork loin. Salami andouille kielbasa hamburger. Bresaola hamburger capicola ball tip, brisket tri-tip meatloaf flank pork loin ribeye spare ribs. Turkey ground round pork chop, leberkas short ribs jowl doner tongue pork loin.

    Some content here


    Ответ

    Потому что Вы вызываете Ваше IIFE в head, где ни одного элемента, к которым обращается код, еще не существует.
    window.addEventListener("load", function() { "use strict"; ... });

    Ни в одном браузере.
    Это же отлично! Значит, когда Вы почините код, он заработает во всех браузерах!

    запомнить необязательную группу в регулярном выражении

    Имеется ли возможность запомнить значение необязательно группы в регулярном выражении?
    Пример, близкий к моему случаю:
    Допустим, у меня имеется регулярное выражение
    (?:ВАЗ 2666).*(3 литра|10 тонн)
    и 3 предложения для проверки
    Автомобиль марки ВАЗ 2666 потребляет 3 литра бензина Автомобиль марки ВАЗ 2666 весит 10 тонн Автомобиль марки ВАЗ 2666 - это просто мечта!
    Что тут получается: обработчик находит первые два предложения и запоминает в них группы ("3 литра" и "10 тонн" в каждом).. Что нужно: чтобы обрабочик искал и учитывал все предложения, где встречается "ВАЗ 2666" и если находит "3 литра" или "10 тонн", то запоминал в массив и их.. Пробовал: ставить ? в конце выражения, обработчик ищет нужные предложения, но пропускает и не запоминает "3 литра" и "10 тонн".
    Заранее извиняюсь за сложное объяснение простого вопроса.


    Ответ

    Сразу замечу, что (?:ВАЗ 2666) = ВАЗ 2666. ВАЗ 2666.*(3 литра|10 тонн)? не сработает, так как .* сразу захватит весь текст до конца строки (это "жадный" шаблон) и не оставит текста для (3 литра|10 тонн)?, который найдет всего лишь пустую строку (да, ведь квантификатор ? позволяет находить "пустое" совпадение).
    Используйте
    /ВАЗ 2666(?:.*(3 литра|10 тонн))?/
    Подробности
    ВАЗ 2666 - буквальная подстрока ВАЗ 2666 (?: - начало необязательной (так как после неё стоит квантификатор ?) незахватывающей (так как после скобки стоит ?:, текст, найденный шаблонами в этой группе не будет помещён в отдельный буфер памяти) группы (квантификатор ? "жадный", движок попробует найти все шаблоны в этой группе хотя бы 1 раз, а если не найдёт совпадения, то совпадение все равно будет возвращено, если были найдены предыдущие шаблоны)
    .* - 0 и более любых символов кроме символа перехода на новую строку (3 литра|10 тонн) - либо 3 литра, либо 10 тонн (эта группа обязательная, т.е. если этот текст есть, он будет помещён в буфер первой захватывающей подмаски) )? - конец необязательной группы.
    Демо регулярного выражения

    CMake не видит компилятора

    Поставил CMake (без CLang), добавил в переменную path путь к cmake-3.9.2/bin
    cmake -version
    работает.
    Есть CMakeLists.txt файл
    #cmake
    cmake_minimum_required(VERSION 3.5)
    project(concentration)
    option(set_clang "set clang as default compiler" 0) option(set_gpp "set g++ as default compiler" 0) option(cros_compile "cros compile for win32" 0)
    if(${UNIX}) message(STATUS "Unix system") elseif(${WIN32}) message(WARNING "Work is not guaranted") else() message(FATAL_ERROR "System not supported") endif()
    if(set_gpp) set(CMAKE_CXX_COMPILER g++) endif() if(set_clang) set(CMAKE_CXX_COMPILER clang++) endif() if(cros_compile) set(PROJECT_NAME ${PROJECT_NAME}.exe) set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix) set(CMAKE_CXX_FLAGS "-static-libstdc++ -static-libgcc") endif()
    message(STATUS "Project " ${PROJECT_NAME}) message(STATUS "cxx compiler " ${CMAKE_CXX_COMPILER})
    add_definitions(-Wall -std=c++14)
    include_directories(include)
    set(MAIN_SRC sources/main.cpp) file(GLOB CONCENTRATION_SRC "sources/concentration/*.cpp")
    if(cros_compile) find_package(PDCurses REQUIRED) else() find_package(Curses REQUIRED) endif()
    include_directories(${CURSES_INCLUDE_DIR})
    add_executable(${PROJECT_NAME} ${MAIN_SRC} ${CONCENTRATION_SRC})
    target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
    в общем когда запускаю командами
    cmake cmake -Dset_gpp=1
    CMake пишет:
    -- The C compiler identification is unknown -- The CXX compiler identification is unknown CMake Error at CMakeLists.txt:5 (project): The CMAKE_C_COMPILER:
    cl
    is not a full path and was not found in the PATH.
    To use the NMake generator with Visual C++, cmake must be run from a shell that can use the compiler cl from the command line. This environment is unable to invoke the cl compiler. To fix this problem, run cmake from the Visual Studio Command Prompt (vcvarsall.bat).
    Tell CMake where to find the compiler by setting either the environment variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to the compiler, or to the compiler name if it is in the PATH.
    CMake Error at CMakeLists.txt:5 (project): The CMAKE_CXX_COMPILER:
    cl
    is not a full path and was not found in the PATH.
    To use the NMake generator with Visual C++, cmake must be run from a shell that can use the compiler cl from the command line. This environment is unable to invoke the cl compiler. To fix this problem, run cmake from the Visual Studio Command Prompt (vcvarsall.bat).
    Tell CMake where to find the compiler by setting either the environment variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path to the compiler, or to the compiler name if it is in the PATH.
    -- Configuring incomplete, errors occurred! See also "../CMakeFiles/CMakeOutput.log". See also "../CMakeFiles/CMakeError.log".
    Путь к компилятору есть в path. g++ команда работает. Постоянно компилирую с командной строки. Пробовал в CmakeLists.txt указывать явный путь к g++. Все равно не помогает. Все пути к файлам - латиница.
    В общем, нужна помощь!


    Ответ

    В Windows, судя по исходникам, CMake по дефолту (если генератор не указан явно) пробует найти (по записям в реестре) самую свежую версию Visual Studio, а если не находит, использует NMake.
    Таким образом, если у вас установлена Студия (или просто остался мусор в реестре, в результате некорректного удаления студии или по другим, гораздо более серьезным причинам), то CMake будет делать проект под самую свежую из установленных Студий.
    Чтобы явно указать нужный вам генератор, используйте ключик -G:
    cmake -G "MinGW Makefiles"

    Где применить абстрактный класс и его свойства?

    Создаю приложение в Qt для работы с базой данных. По заданию необходимо использованием абстрактных классов. Например я хочу создать класс который связывается и работает с базой данных SQL и непосредственно при добавлении новой информации сразу добавляет информацию и в память и в TableWidget.
    class DataBase{ public: virtual void save() = 0; //Сохраняет информацию в SQL virtual void update() = 0; //Загружает из SQL таблицы и добавляет в память virtual void del(int index) = 0; //Удаляет какой-то index элемент таблицы };
    Ну и так далее, а затем создать какой-нить класс, который уже наследуется от DataBase
    class StudentsData: public DataBase{ private: vector names; //имена студентов vector lastnames; //фамилии студентов vector marks; //оценки студентов public: //.. определить виртуальные функции .. // };
    То есть класс DataBase по сути абстрактный класс, который предназначен для работы с какой-то конкретной таблицей базы данных. Я просто совсем недавно начал пытаться разбираться с абстрактными классами и хотел понять, правильно я их смысл понимаю, потому что в интернете нашел единственный с точки зрения логики пример про абстрактный класс фигуры. И есть предложения как сделать проще и лучше?


    Ответ

    Смысль абстрактного класса пропадает, если предусмотрена реализация только одного потомка. Что у вас не так?.. Скажу мое мнение:
    Во первых virtual void delete(int) = 0; (тут излишне придать имя, поскольку обьект не используется). Индекс какого вектора из трех имеется ввиду?.. Вы будете удалять из имени, из фамилии или из оценок?.. По этой причине и для демонстрации преимуществ абстрактного( интерфейсным называют не спроста) класса, разделим понятие StudentsData на части. Именно такой подход позволяет разделять и властвовать...
    Во вторых идентификатор delete это один из многих (скорее не очень многих) имен, который нельзя использовать в C++ в целях, отличных от той, для чего он предназначен...(специалистам прошу это предложение редактировать, если я неясно выразился)
    class DataBase{ public: virtual void save() = 0; virtual void update() = 0; virtual void del(int); virtual bool size() const = 0; }; class StudentsNames: public DataBase{ private: vector names; //имена студентов public: //.. определить виртуальные функции .. del(int) можно не определять// }; class StudentsLastNames: public DataBase{ private: vector lastnames; //фамилии студентов public: //.. определить виртуальные функции .. del(int) можно не определять// }; class StudentsMarks: public DataBase{ private: vector marks; //оценки студентов public: //.. определить виртуальные функции .. del(int) можно не определять// }; //... дальше можно добавить произвольное количество наследников, //при этом перекомпиляция вашего кода сведется к минимуму.
    void implementation_code(DataBase* pb, int index) { p->update(); // загружать if (p->size() > index) //если имеется больше index символов p->del(index); //удалить (index + 1)- ый элемент p->save(); //сохранить результат }
    теперь можем функцию использовать для любого потомка, т.е. загружать, удалять какой то элемент и сохранить результат имени или фамилии или оценки
    StudentsNames name; StudentsLastNames last_name; StudentsMarks marks;
    и если для всех трех потомков определен del(int)
    implementation_code(&name, 20); implementation_code(&last_name, 20); implementation_code(&marks, 5);
    Вы вполне можете написать и подругому. Все зависит от целей и вкуса. Можете добавить любое количество потомков, и это не станет причиной перекомпиляции кода и легко будет управлять обьектами этих типов.
    P.S. уверен, что многие расскажут лучше, я попытался помочь как могу...

    Запись и чтение Сектора диска С++

    Хочу записывать и читать информацию прямиком из сектора диска а не из файла. На С++. Приложите пример по максимуму простой. Или ссылку дайте. Посекторное чтение и запись я полагаю даст мне возможность делать полные посекторные копии нескольких ОС и разделов сразу. Также делать защиту программ от взлома.
    вот финальный код ширения основан на ответе.Чтение первого сектора первого диска.
    #include #include #include using namespace std;
    int win_error() { cout<<"error"<int main() {
    HANDLE hDisk = ::CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDisk == INVALID_HANDLE_VALUE) throw win_error();
    BYTE buf[512]; DWORD dwRead; if (!::ReadFile(hDisk, buf, sizeof(buf), &dwRead, NULL) || dwRead != sizeof(buf)) throw win_error(); ::CloseHandle(hDisk);
    ofstream out("1.txt"); for(int i = 0; i<512;i++) { char f[3]; itoa(buf[i],f,16); out<'; cout<Визуалку надо от имени админа запускать, проект создавать не консольный а пустой enemy. Буду благодарен если кто то ещё покажет как позицию чтение установить. и записывать в заданную позицию, можно в 32 сектор писать для примера, там никогда ничего важного нет. Благодарен всем участникам.


    Ответ

    В принципе, если не хотеть странного вроде небуферизованного ввода/вывода, то там все так же, как и для файлов. Диски открываются все той же функцией CreateFile, но для dwShareMode надо обязательно указывать (FILE_SHARE_READ | FILE_SHARE_WRITE), а в dwCreationDisposition должно (естественно) стоять OPEN_EXISTING. В качестве имени должно стоять, например, для физического диска "\\.\PhysicalDrive0", а для логического - "\\.\C:". А дальше все так же, как и для файла - читаем ReadFile, пишем WriteFile, закрываем CloseHandle.
    В описании CreateFile все это подробно расписано, и если вы действительно будете это делать, читать MSDN вам скорее всего все равно придется. Имейте только ввиду, что начиная с Висты доступ к диску требует поднятия привилегий (elevation). То есть программу нужно 1) запустить с учетки администратора, 2) в манифесте должно стоять требования административных привилегий, и 3) при каждом запуске юзер должен подтверждать, что да, он действительно хочет запустить эту опасную программу (которая у вас, вероятно, даже не подписана сертификатом). Без этого CreateFile будет просто возвращать ошибку ERROR_ACCESS_DENIED.
    UPD: С утра набросал крохотную демонстрашку, она читает самый первый сектор диска С: (писать туда не стал, но тоже можно:). Исключение win_error только замените на какую-нибудь свою обработку.
    HANDLE hDisk = ::CreateFile(L"\\\\.\\C:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDisk == INVALID_HANDLE_VALUE) throw win_error();
    BYTE buf[512]; DWORD dwRead; if (!::ReadFile(hDisk, buf, sizeof(buf), &dwRead, NULL) || dwRead != sizeof(buf)) throw win_error(); ::CloseHandle(hDisk);
    Как уже было сказано, запускать надо командой "Run as Administrator" иначе CreateFile вернет ошибку.

    Как вытащить значение из словаря JSON?

    Пишу на Python. Из словаря в JSON нужно вытащить значение ключа "city". Кусок словаря ниже.
    { "query": { "count": 1, "created": "2018-07-15T13:21:02Z", "lang": "en-US", "results": { "channel": { "units": { "distance": "mi", "pressure": "in", "speed": "mph", "temperature": "F" }, "title": "Yahoo! Weather - Nome, AK, US", "link": "http://us.rd.yahoo.com/dailynews/rss/weather/Country__Country/*https://weather.yahoo.com/country/state/city-2460286/", "description": "Yahoo! Weather for Nome, AK, US", "language": "en-us", "lastBuildDate": "Sun, 15 Jul 2018 05:21 AM AKDT", "ttl": "60", "location": { "city": "Nome", "country": "United States", "region": " AK" }, "wind": { "chill": "50", "direction": "270", "speed": "11" }, "atmosphere": { "humidity": "90", "pressure": "1009.0", "rising": "0", "visibility": "14.9" }, "astronomy": { "sunrise": "1:4 am", "sunset": "5:9 am" }, "image": { "title": "Yahoo! Weather", "width": "142", "height": "18", "link": "http://weather.yahoo.com", "url": "http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif" }, "item": { "title": "Conditions for Nome, AK, US at 03:00 AM AKDT", "lat": "64.499474", "long": "-165.405792", "link": "http://us.rd.yahoo.com/dailynews/rss/weather/Country__Country/*https://weather.yahoo.com/country/state/city-2460286/", "pubDate": "Sun, 15 Jul 2018 03:00 AM AKDT", "condition": { "code": "26", "date": "Sun, 15 Jul 2018 03:00 AM AKDT", "temp": "52", "text": "Cloudy" }, "forecast": [ { "code": "11", "date": "15 Jul 2018", "day": "Sun", "high": "53", "low": "49", "text": "Showers" },
    Значение ключа "count" вывести получается:
    response = requests.get(url).json() print(response["query"]["count"])
    А вот то, что дальше не знаю как оформить, подскажите, пожалуйста.


    Ответ

    Воспользуйтесь модулем dpath
    In [193]: import dpath # pip install dpath
    In [194]: dpath.util.search(response, '**/city') Out[194]: {'query': {'results': {'channel': {'location': {'city': 'Nome'}}}}}
    In [199]: dpath.util.values(response, '**/city') Out[199]: ['Nome']
    In [200]: dpath.util.get(response, '/query/results/channel/location/city') Out[200]: 'Nome'
    PS пример валидного JSON response...
    In [201]: url = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22munich%2C%20germany%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys'
    In [202]: import requests
    In [203]: response = requests.get(url).json()
    In [204]: dpath.util.get(response, '/query/results/channel/location/city') Out[204]: 'Munich'
    In [205]: dpath.util.values(response, '**/city') Out[205]: ['Munich']
    In [206]: dpath.util.search(response, '**/city') Out[206]: {'query': {'results': {'channel': {'location': {'city': 'Munich'}}}}}
    In [207]: dpath.util.get(response, '/query/results/channel/location') Out[207]: {'city': 'Munich', 'country': 'Germany', 'region': ' BY'}

    Анимированная линия, которая постепенно меняет цвет

    Какими средствами анимировать линию по типу progress bar проще всего?
    Я пошел по пути svg, но не уверен что это разумное решение для данного случая. Может на css лучше делать?

    $(document).ready(function () { // SVG animate var s = Snap("#svg1"); var line = s.path("M 0 0 L 360 0"); var line_hover = s.path("M 0 0 L 0 0"); line_hover.attr({ fill: "transparent", stroke: "#4054b2", strokeWidth: 5 }); line.attr({ fill: "#000", stroke: "rgba(0, 0, 0, 0.1)", strokeWidth: 5 }); line_hover.animate({d: "L 360 0"}, 3000); var s2 = Snap("#svg2"); var line2 = s2.path("M 0 0 L 360 0"); var line2_hover = s2.path("M 0 0 L 0 0"); line2_hover.attr({ fill: "transparent", stroke: "#4054b2", strokeWidth: 5 }); line2.attr({ fill: "#000", stroke: "rgba(0, 0, 0, 0.1)", strokeWidth: 5 }); line2_hover.animate({d: "L 360 0"}, 6000); }); .connection__wrap { text-align: center; max-width: 1440px; margin: 0 auto; } .connection__content{ display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; padding: 90px 0; } .connection__content-item { text-align: center; width: 300px; } .connection__content-item-img { display: flex; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 144px; height: 144px; margin: 0 auto 26px; position: relative; border-radius: 50%; display: -webkit-box; display: -ms-flexbox; -webkit-box-align: center; } .connection__content-item-img.pink { background: -webkit-gradient(linear,right top,left top,from(#F64A89),to(#D81B60)); background: linear-gradient(to left,#F64A89,#D81B60); -webkit-box-shadow: 0 0 20px rgba(216,27,96,.5); box-shadow: 0 0 20px rgba(216,27,96,.5); } .connection__content-item-img.orange { background: -webkit-gradient(linear,right top,left top,from(#FE8D69),to(#F4511E)); background: linear-gradient(to left,#FE8D69,#F4511E); -webkit-box-shadow: 0 0 20px rgba(244,81,30,.5); box-shadow: 0 0 20px rgba(244,81,30,.5); } .connection__content-item-img.red { background: -webkit-gradient(linear,right top,left top,from(#F76763),to(#E53935)); background: linear-gradient(to left,#F76763,#E53935); -webkit-box-shadow: 0 0 20px rgba(229,57,53,.5); box-shadow: 0 0 20px rgba(229,57,53,.5); } .svg{ top: 50%; position: absolute; width: 360px; height: 10px; left: 170px; } #svg1{ width: 360px; height: 10px; margin: 0 auto; } #svg2{ width: 360px; height: 10px; margin: 0 auto; } button{ padding: 15px; }

    Заголовок

    Текст

    Текст

    Текст



    Ответ

    Вот что у меня получилось, по крайней мере разобрался с анимацией линий. Все дело в циклах ;)
    $(document).ready(function () { // SVG animate var s = Snap("#svg1"); var linePos = [ { m1: 0, m2: 0, l1: 0, l2: 0, dm1: 0, dm2: 0, dl1: 360, dl2: 0, delay: 800, timeout: 0 }, { m1: 556, m2: 0, l1: 556, l2: 0, dm1: 556, dm2: 0, dl1: 916, dl2: 0, delay: 800, timeout: 800 }, { m1: 1110, m2: 0, l1: 1110, l2: 0, dm1: 1110, dm2: 0, dl1: 1180, dl2: 0, delay: 300, timeout: 1600 }, { m1: 1180, m2: 0, l1: 1180, l2: 0, dm1: 1180, dm2: 0, dl1: 1180, dl2: 260, delay: 500, timeout: 1900 }, { m1: 1180, m2: 260, l1: 1180, l2: 260, dm1: 1180, dm2: 260, dl1: 628, dl2: 260, delay: 1000, timeout: 2400 } ]; var i = 0; linePos.forEach(function(value, currentIndex) { setTimeout(function() { createLineAnimate(currentIndex); i++; }, linePos[currentIndex].timeout); }); function createLineAnimate(i) { s.path("M " + linePos[i].m1 + " " + linePos[i].m2 + " L " + linePos[i].l1 + " " + linePos[i].l2 ) .attr({ fill: "transparent", stroke: "#827ee9", strokeWidth: 5 }) .animate({d: "M " + linePos[i].dm1 + " " + linePos[i].dm2 + " L " + linePos[i].dl1 + " " + linePos[i].dl2}, linePos[i].delay); } }); .connection__wrap { text-align: center; max-width: 1440px; margin: 0 auto; } .connection__content{ display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; padding: 90px 0; } .connection__content-item { text-align: center; width: 300px; } .connection__content-item-img { display: flex; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 144px; height: 144px; margin: 0 auto 26px; position: relative; border-radius: 50%; display: -webkit-box; display: -ms-flexbox; -webkit-box-align: center; } .connection__content-item-img.pink { background: -webkit-gradient(linear,right top,left top,from(#F64A89),to(#D81B60)); background: linear-gradient(to left,#F64A89,#D81B60); -webkit-box-shadow: 0 0 20px rgba(216,27,96,.5); box-shadow: 0 0 20px rgba(216,27,96,.5); } .connection__content-item-img.orange { background: -webkit-gradient(linear,right top,left top,from(#FE8D69),to(#F4511E)); background: linear-gradient(to left,#FE8D69,#F4511E); -webkit-box-shadow: 0 0 20px rgba(244,81,30,.5); box-shadow: 0 0 20px rgba(244,81,30,.5); } .connection__content-item-img.red { background: -webkit-gradient(linear,right top,left top,from(#F76763),to(#E53935)); background: linear-gradient(to left,#F76763,#E53935); -webkit-box-shadow: 0 0 20px rgba(229,57,53,.5); box-shadow: 0 0 20px rgba(229,57,53,.5); } .svg{ position: absolute; top: 50%; width: 1180px; height: 260px; left: 170px; } #svg1{ width: 1180px; height: 260px; margin: 0 auto; } button{ padding: 15px; }

    Заголовок

    Текст

    Текст

    Текст


    Условия if/else в pug

    Есть блок с svg и нужно менять содержимое в зависимости от переменной, код:
    mixin container(svg) .logo-box if svg == first svg.class__first else if svg === second svg.class__second else if svg === third svg.class__third else svg.class__fourth +container(first) +container(second) +container(third)
    Проблема заключается в том, что неважно какое значение я пишу в миксине container() всегда отображается svg.class__first?


    Ответ

    Синтаксис pug, вроде как, гласит что нужны кавычки.
    mixin container(svg) .logo-box if svg=='first' svg.class__first else if svg=='second' svg.class__second else if svg=='third' svg.class__third else svg.class__fourth
    +container('first') +container('second') +container('third')
    Пример на CodePen (View Compiled HTML)

    c++ stl: сортировка и копирование

    Подскажите пожалуйста, есть ли возможность средствами STL отсортировать вектор в новый вектор?
    Что-то типа
    std::vector data2 = std::sort_copy(data1.begin(), data1.end(), [](int v1, int v2){...});
    Просто не хочется писать следующий код:
    std::vector data2 = data1; std::sort(data1.begin(), data1.end(), [](int v1, int v2){...});
    А то начинает страдать чувство прекрасного от лишнего присваивания :)
    P.S. исправил ошибку в параметрах sort


    Ответ

    Вы не только можете копировать в другой контейнер все содержимое первого вектора в отсортированном виде, но и любую отсортированную партию:
    std::vector data1{84, 44, 12, 23, 34, 8, 7, 4}, data2(data1.size()); auto f1 = data1.begin(), s1 = data1.end(), f2 = data2.begin(), s2 = data2.end(); std::partial_sort_copy(f1, s1, f2, s2);
    теперь data2 содержит элементы со значением из data1 в отсортированном порядке, а data1 не изменил свое состояние.
    //data1: 84 44 12 23 34 8 7 4 //data2: 4 7 8 12 23 34 44 84
    Например, мы хотим копировать половину отсортированной последовательности, по критерию, отличную от std::less(например в убывающем порядке). Тогда:
    std::partial_sort_copy(f1, s1, f2, f2 + std::distance(f2,s2)/2, std::greater()); //data2: 84 44 34 23 23 34 44 84

    Большое расстояние между значениями Console.Writeline

    При обучении работы с базой данных MS SQL Server, при попытке вывести данные со столбцов ID, Name, Points таблицы users, программа по какой-то причине выдает данные строки Points с большим отступом как показано на рисунке:

    Прошу объяснить мне по почему бывает такая ситуация, и как решить данную проблему. Код метода:
    static void print() { DataClassesUserInfoDataContext Userinfo = new DataClassesUserInfoDataContext(); var custs = from c in Userinfo.users select new { Id = c.ID, Name = c.Name, Points = c.Points }; Console.WriteLine("ID - Name - Points"); foreach (var cust in custs) { Console.WriteLine("{0} - {1} - {2}", cust.Id, cust.Name, cust.Points); } Console.WriteLine("Нажмите любую клавишу для завершения работы..."); Console.ReadKey(); Environment.Exit(0); }


    Ответ

    Потому что значения в поле Name заканчиваются хвостами из пробелов.
    Console.WriteLine("[{0}] - [{1}] - [{2}]", cust.Id, cust.Name, cust.Points);
    Вероятно, тип поля в базе - строковый, фиксированной длины.
    Console.WriteLine("{0} - {1} - {2}", cust.Id, cust.Name.Trim(), cust.Points);

    Получить значение по ключу из JSON строки (SQL Server 2014)

    Продолжение предыдущего вопроса
    Есть поле, которое хранит json текст. Внутри есть переменная id {"Id":25680,"Code":.... Нужно из json взять Id объекта и поместить значение в поле. Как вырезать значение Id? Кол-во цифр разное.
    Функция JSON_VALUE не поддерживается в SQL Server 2014


    Ответ

    Можно через substring, если текст имеет одну и ту же структуру:
    create table table1 (json varchar (200)); insert into table1 values ('{"Id":25680,"Code":....')
    select substring (json,charindex (':',json)+1,charindex (',',json)-charindex (':',json)-1) from table1
    Fiddle

    Запрос к XML в mssql

    Имеется кострукция вида:
    ... ... ... ... ...
    Кол-во элементов setting не известно. То есть в каждой записи может присутствовать от 0 до n данных элементов.
    Я понимаю, как вывести единичные элменты. Например, id
    SELECT column.value('(first/id) [1]', 'integer') AS 'id' FROM table
    Но вот с множественными элементами возникает вопрос. Требуется чтобы при запросе я получил список вида:
    id | setting id | setting ....


    Ответ

    DECLARE @Test XML
    SET @Test = CAST( ' 100 MyObject p1 p2 2 3 ' AS XML)
    SELECT t.f.value('(first/id)[1]', 'integer') AS Id, n.s.value('.[1]', 'varchar(100)') AS params, n.s.value('(./param1)[1]', 'varchar(100)') AS param1, n.s.value('(./param2)[1]', 'varchar(100)') AS param2 FROM (SELECT @Test AS f) t CROSS APPLY f.nodes('first/settings/setting/.[1]') n(s)
    UPD: Для приведенного примера выбор из таблицы:
    SELECT t.column.value('(first/id)[1]', 'integer') AS Id, nodes.setting.value('.[1]', 'varchar(100)') FROM table t CROSS APPLY t.column.nodes('first/settings/setting/.[1]') nodes(setting)

    Распознавание русских символов с изображений jpg, bmp, png

    Подскажите библиотеку для распознавания русских символов с изображения, и возможностью использования в приложениях .Net


    Ответ

    https://github.com/tesseract-ocr/tesseract - просто загрузите русские шрифты

    Как работает lookbehind в js?

    Ожидал, что выражение /(.)(? console.log("12".match(/(.)(?


    Ответ

    Это происходит по той причине, что .* может найти пустую строку, а значит выражение (.)(?Используйте .+
    console.log("12".match(/(.)(? Блок предварительного просмотра вперёд срабатывает в том месте, где находится текущая позиция. (.) находит 1, сразу после этого происходит проверка, есть ли перед текущей позицией такой же символ, перед которым может быть 1 и более символов, отличных от знаков перехода на новую строку. Т.е. можно представить это так: после того, как найдена 1, срабатывает .+, как в блоке предварительного просмотора вперёд (только тут этот шаблон находит всю подстроку до её начала), а потом движок ищет ближайший к началу строки символ, идентичный захваченному в группе №1. Так как текущая позиция находится сразу после 1, .+ не разрешает \1 найти захваченный символ (так как перед этим идентичным символом должен быть как минимум один символ).