Страницы

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

понедельник, 19 ноября 2018 г.

JavaScript: клик по перекрытому элементу

В данном эксперименте синий квадрат спозиционирован абсолютно, полностью закрывая собой красный. Допустим, по тем или иным причинам красный квадрат также спозиционировать абсолютно и добавить ему больший z-index не позволено. Можно ли при таком раскладе заставить реагировать на клик красный квадрат?
var $redDiv = $('.div1'); var $blueDiv = $('.div2'); var $parent = $('.parent'); $redDiv.on('click', function(){ console.log('OK'); }); .div1, .div2{ width: 100px; height: 100px; } .parent{ position: relative; height: 200px; } .div1{ background: rgba( 255, 0, 0, 0.5); } .div2{ background: rgba( 0, 0, 255, 0.5); position: absolute; top: 0; left: 0; }



Ответ

Используйте pointer-events: none; на том элементе, который должен быть «прозрачным» для кликов.
var $redDiv = $('.redDiv'); var $blueDiv = $('.blueDiv'); var $parent = $('.parent'); $redDiv.on('click', function(){ alert('Click on Red catched'); }); .redDiv, .blueDiv{ width: 100px; height: 100px; } .parent{ position: relative; height: 200px; } .redDiv{ background: red; } .blueDiv{ background: blue; position: absolute; pointer-events: none; top: 10px; left: 10px; }


Как лучше наследовать обычный класс от дженерика в С#

Как написать наследование обычного класса от дженерика или это не совсем правильная практика?
using System;
public class Program{ public static void Main(){
var obj1 = new Child(25); obj1.objectType(); } }
class Child : Parent {
public Child(int num){ this.obj = num; } }
class Parent{ T obj;
public Parent(T obj) { this.obj = obj; }
public void objectType(){ Console.WriteLine("Тип : " + typeof(T)); }
}


Ответ

Наследовать от обобщенного класса можно и такое решение оправдано. Но при этом нужно либо чтобы новый класс тоже был обобщенным, либо указывал конкретный тип параметра.
Т.е. либо:
class Child : Parent { public Child(T num) : base(num) { } }
Либо:
class Child : Parent { public Child(int num) : base(num) { } }
P.S. Как верно заметил @Grundy, нужно вызывать базовый конструктор.

Массив целых чисел: TypeError: only length-1 arrays can be converted to Python scalars

import scipy import scipy.fftpack import cmath import math import matplotlib.pyplot as plt import numpy as np from scipy import signal from scipy.signal import freqs, iirfilter xx = np.linspace(0, 1024, 1024) # диапазон значений x byts = ([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]) ff = 64 # %Частота несущей ns = np.sin(2 * np.pi * (x - 1) * ff / 1024) # несущая y = ns * byts[round(int(x + 31) / 64)] # %сигнал plt.plot(y)
Ошибка:
TypeError: only length-1 arrays can be converted to Python scalars
Как правильно нужно задать массив целых чисел х, чтобы не возникало данной ошибки?


Ответ

Разберёмся, почему возникает данная ошибка. Посмотрим на выражение:
round(int(x + 31) / 64)
x + 31 это массив длины 1024, а мы его приводим к int'у и непонятно, что должно получиться в результате. Python так и говорит:
TypeError: только массивы длины один могут быть приведены к скалярному типу (int это скалярный тип)
Уберём приведение к int'у:
y = ns * byts[round((x + 31) / 64)]
Ошибка пропадёт, но появится другая:
TypeError: type numpy.ndarray doesn't define __round__ method
Можно заменить round на np.round
y = ns * byts[np.round((x + 31) / 64)]
Мы получим другую ошибку
TypeError: only integer scalar arrays can be converted to a scalar index
Дело в том, что np.round((x + 31) / 64) это массив, с типом элементов float, а мы используем этот массив как массив индексов, а индексы могут быть только целыми. Нужно изменить тип элементов массива с помощью astype
y = ns * byts[np.round((x + 31) / 64).astype(int)]
Мы опять получим другую ошибку
TypeError: only integer scalar arrays can be converted to a scalar index
Дело в том, что byts это обычный массив, и через квадратные скобки нельзя обращаться с массивом индексов. Сделаем byts numpy-массивом:
byts = np.array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1])
Наша следующая ошибка
IndexError: index 16 is out of bounds for axis 1 with size 16
Возникает из-за того, что в конце массива np.round((x + 31) / 64 есть элементы, равные 16. Возможным решением будет изменение типа элементов массива x на int
x = np.linspace(0, 1023, 1024).astype(int)
и замена сложного выражения np.round((x + 31) / 64 на простое x // 64
y = ns * byts[x // 64] # %сигнал
Итоговый код:
import scipy import scipy.fftpack import cmath import math import matplotlib.pyplot as plt import numpy as np from scipy import signal from scipy.signal import freqs, iirfilter x = np.linspace(0, 1023, 1024).astype(int) # диапазон значений x byts = np.array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]) ff = 64 # %Частота несущей ns = np.sin(2 * np.pi * (x - 1) * ff / 1024) # несущая y = ns * byts[x // 64] # %сигнал plt.plot(y)

Геттеры и сеттеры для статических полей

Вопрос, возможно, глупый, но всё же... Нужны ли геттеры и сеттеры для статических полей, или их лучше объявлять public?
Т.е, какой из вариантов лучше?
1 вариант:
public abstract class SomeClass { public static boolean isReadOnly = false; }
и далее использовать SomeClass.isReadOnly = true;
2 вариант:
public abstract class SomeClass { private static boolean isReadOnly = false;
public static boolean isReadOnly() { return isReadOnly; }
public static void setReadOnly(boolean isReadOnly) { SomeClass.isReadOnly = isReadOnly; } }
и далее использовать SomeClass.setReadOnly(true);


Ответ

Область видимости поля нужно определять исходя из того, где оно будет использовано. (ваш К.О.)
В вашем случае с примитивным типом никакой разницы нет. Вы в обоих вариантах позволяете модифицировать переменную.
Если, к примеру, вам нужны какие-то дополнительные проверки при записи, тогда имеет смысл использовать приватное поле и сеттер. Или если у вас поле-объект и вы не хотите давать ссылку на него напрямую (как в случае с public), тогда имеет смысл использовать приватное поле и геттер, который возвращает копию объекта.

Некорректный шрифт при загрузке из файла в WPF

Загружаю шрифт в программу посредством
GetNonCachedFontFamilies(MainPath).FirstOrDefault();
Метод GetNonCachedFontFamilies
public static IEnumerable GetNonCachedFontFamilies(string location) { if (string.IsNullOrEmpty("location")) throw new ArgumentException("Must provide a location", "location");
DirectoryInfo directoryInfo = new DirectoryInfo(location); if (directoryInfo.Exists) { FileInfo[] fileInfos = directoryInfo.GetFiles("*.?tf"); foreach (FileInfo fileInfo in fileInfos) yield return CreateFontFamily(fileInfo.FullName); } else { FileInfo fileInfo = new FileInfo(location); if (fileInfo.Exists) yield return CreateFontFamily(location); } }
Метод CreateFontFamily
private static FontFamily CreateFontFamily(string path) { if (!Uri.TryCreate(path, UriKind.Absolute, out Uri uri)) throw new ArgumentException("Must provide a valid location", "path");
return new FontFamily(uri, string.Empty); }
Шрифт программа находит и загружает, с этим проблем нет. Только отображается шрифт не правильно. Это должен быть рукописный кириллический шрифт, а похож на Microsoft Sans Serif/Calibri (т.е. не рукописный). Что я не так делаю? Если что, текст отображаю посредством TextBlock, который динамически создаётся из кода. Прошу без xaml.


Ответ

Вы неправильно используете функцию new FontFamily(uri, string.Empty), надо обязательно использовать имя шрифта. Ниже рабочий код.
public static IEnumerable GetNonCachedFontFamilies(string location) { if (string.IsNullOrEmpty("location")) throw new ArgumentException("Must provide a location", "location");
DirectoryInfo directoryInfo = new DirectoryInfo(location); if (directoryInfo.Exists) { FileInfo[] fileInfos = directoryInfo.GetFiles("*.?tf"); foreach (FileInfo fileInfo in fileInfos) yield return CreateFontFamily(fileInfo.DirectoryName, fileInfo.Name); } else { FileInfo fileInfo = new FileInfo(location); if (fileInfo.Exists) yield return CreateFontFamily(fileInfo.DirectoryName, fileInfo.Name); } }
private static FontFamily CreateFontFamily(string path, string filename) { if (!Uri.TryCreate(path + "\\" + filename, UriKind.Absolute, out Uri uri)) throw new ArgumentException("Must provide a valid location", "path");
GlyphTypeface glyphTypeface = new GlyphTypeface(uri); return new FontFamily(path + "\\#" + glyphTypeface.FamilyNames.FirstOrDefault().Value); }

Можно/нужно ли делать сервисы бизнес логики одиночками (Singleton) или статическими?

Например у меня есть сервисы ScannerService и UsersService. Первый отвечает за управление сканером на устройстве, второй получает данные из базы данных и содержит в себе объект DbContext (реализация UoW) для работы с базой данных. На разных формах используются разные сервисы, но эти два почти на всех. Стоит ли создавать новые объекта в каждой форме, или лучше использовать Singleton?
Можно ли объект, реализующий Unit of work, делать Singleton? Он вроде должен быть уничтожен после выполнения работы сервиса, в котором используется, но для меня не очевидно зачем его создавать по сто раз для каждого сервиса, если можно создать один раз и уничтожить после выполнения работы приложения.
Есть ли причины не делать сервисы статическими, если мне не нужно создавать их объекты, а нужно лишь использовать их функции, которые можно сделать статическими?


Ответ

Объект DbContext кэширует в себе все выбранные через него объекты (т.е. реализует не только Repository, UoW, но еще и Identity Map).
Соответственно, если вы косвенно сделаете его синглтоном, то ваше приложение
закэширует в себе все выбираемые через себя данные (всю базу) перестанет видеть изменения, вносимые в базу извне не сможет восстановиться после первой же ошибки валидации / сохранения (упал один SaveChanges - упадут и все следующие) будет дико тупить при сохранении из-за необходимости обнаруживать изменения в большом количестве объектов
Нет никаких причин делать сервисы или вообще любые другие классы статическими, если того явно не требует логика работы конкретных классов. Т.е. статическим синглтоном может быть какой-то глобальный кэш, который по определению должен быть один на один инстанс приложения. Или, например, класс, оборачивающий в себе доступ к стороннему сервису, и управляющий соединениями к нему (пул соединений SQL, мультиплексор StackExchange Redis и т.п.). И даже в этом случае единственность экземпляра должен обеспечивать контейнер, а не прямая статика.
Все остальное должно быть нестатическим, или, по крайней мере, не должно предполагать статичности/единственности зависимостей в своем коде.

Корутины выполняются в одном потоке?

Короткий вопрос по asincio: Корутины выполняются в одном потоке?
Всегда разные треды, всегда один тред или потоки выделяются по необходимости? Зависит ли это от реализации loop?
Этот вопрос связан с использованием threading.local


Ответ

Да.
An event loop runs in a thread and executes all callbacks and tasks in the same thread.
asyncio.get_event_loop() возвращает цикл событий соответствующий текущему контексту. По умолчанию это текущий поток, то есть один цикл на поток. При вызове из coroutine, возвращается цикл, который эту coroutine выполняет
When called from a coroutine or a callback (e.g. scheduled with call_soon or similar API), this function will always return the running event loop.
Большинство методов и классов в asyncio не являются потокобезопасными. Если хотите из другого потока запустить задачу в цикле, то можно использовать asyncio.run_coroutine_threadsafe()
Даже в одном потоке могут быть проблемы с изменением нелокального состояния при возвращении контроля циклу событий (await). См., PEP 550 -- Execution Context. В Питоне 3.7 доступен contextvars модуль, реализующий PEP 567 -- Context Variables

Как в Python 3 проинициализировать существующий класс в 1 строке свойствами вне конструктора, подобно c#?

В c# есть очень полезная конструкция. Если мне нужно создать экземпляр класса, а свойств, которые надо задать нет в конструкторе, то это можно делать в одной строке таким образом
var mc = new MyClass() { Prop1 = 1, Prop2 = "qwe" };
А можно подобное сделать в питоне?
Вообще требуется собрать список
list = [MyClass(el) for el in otherList]
Вот только проблема в том, что в конструктор MyClass ничего нельзя передать. Как мне в таком случае создать экземпляр и задать 1 или несколько свойств в одной строке?
UPD:
Вопрос похож на предыдущий, но вот те ответы меня не устраивают. Возможно, это потому что сам вопрос там был задан с меньшей конкретикой.
UPD2:
Ах да, вопрос все же отличается. Там человек спрашивает как повесить на автомат функцию инициализации класса, а я спрашиваю как использовать готовый класс, при этом ни намека на автоматику. В общем, советую внимательно вчитаться в оба вопроса, тогда все станет понятно


Ответ

Такого синтаксиса нет.

Но можно создать функцию хелпер:
def post_init(obj, **kwargs): for key, value in kwargs.items(): setattr(obj, key, value) return obj
И юзать её:
l = [post_init(MyClass(), el=el) for el in otherList]

А можно подменить __init__(вообще вариант не оч, но тоже можно):
def replace_init(cls): cls__init__ = cls.__init__ def my_init(self, el=None): cls__init__(self) self.el = el
cls.__init__ = my_init
replace_init(MyCLass)
И юзать такой класс:
l = [MyClass(el) for el in otherList]

Как через async\await вызвать метод DisconnectAsync у сокета?

Как через async\await вызвать метод DisconnectAsync и дождаться его завершения у сокета? Этот метод не поддерживает TAP паттерн. Он поддерживает только старые асинхронные паттерны, с которыми я плохо знаком.


Ответ

DisconnectAsync() действительно является старым API (EAP, event-based asynchronous pattern) и не поддерживает TAP. Однако, если ознакомиться с документаций по TAP, то можно найти рецепт "преобразования" EAP API в TAP. Для этого нужно воспользоваться классом TaskCompletionSource
public static Task DisconnectAsync(this Socket socket, SocketAsyncEventArgs args) { // TaskCompletionSource является обобщенным, // поэтому используем самый "маленький" тип, действительный результат нас не интересует var tcs = new TaskCompletionSource(); // подписываемся на завершение операции args.Completed += (s, e) => { if (e.SocketError == null) { // если операция завершилась успешно, устанавливаем результат таску tcs.SetResult(0); } else { // иначе устанавливаем исключение tcs.SetException(new Exception(e.SocketError.ToString())); } };
var finished = socket.DisconnectAsync(args); if (finished) { // операция завершилась синхронно, просто выходим return Task.Completed; }
return tcs.Task; }
Использование:
await socket.DisconnectAsync(args);

Как добавить поле в большую таблицу PostgreSQL без блокировки?

Есть таблица вот такого вида:
create table email_stats ( id bigserial primary key, mailing_list_id int not null, sended_date timestamp not null, emails_send bigint not null default 0, emails_clicks bigint not null default 0 );
Теперь в неё необходимо добавить новое поле. Так-то задача простая,
alter table email_stats add column emails_paid_clicks bigint not null default 0;
Вот только проблема: табличка уже размером в несколько десятков гигабайт и этот alter table блокирует всю запись в таблицу на длительное время.
Как можно добавить поле без простоя системы?
PS: странно, но не нашёл такого распространённого вопроса здесь


Ответ

Если вы счастливый пользователь PostgreSQL 11 или новее (но не надо бета-версии в рабочие проекты ставить) - то все хитрые фокусы теперь спрятаны внутри и достаточно напрямую сделать alter table
set statement_timeout to '1s'; alter table email_stats add column emails_paid_clicks bigint not null default 0;
Принятый в postgresql 11 патч позволяет больше не копировать всю таблицу заново при добавлении нового поля со значением по-умолчанию. И проблему с длительным блокированием таблицы может представлять только ситуация, когда alter table вынужден ждать получение эксклюзивной блокировки из-за того что эту блокировку удерживают какие-то другие транзакции. Потому имеет смысл ставить небольшой statement_timeout и повторять попытки выполнения alter table

Если же у вас postgresql версии ниже 11, то всё не так просто. В указанном запросе
alter table email_stats add column emails_paid_clicks bigint not null default 0;
к длительной блокировке таблицы приводит default 0. PostgreSQL берёт блокировку на таблицу и начинает перебирать все записи в таблице проставлять на уровне данных и только после этого отпустит блокировку. А вот если вставить default null - то PostgreSQL обновит только метаданные таблицы в служебном каталоге, что очень быстро, но это не то что требуется.
Поэтому внести желаемое изменение возможно, но выглядеть оно будет совсем не так, а в много действий.
Начинаем аккуратно вносить изменение
Сначала добавляем новое поле как null по-умолчанию - это быстро, только изменить метаданные таблицы. Затем ставим желаемое значение по-умолчанию - это значение уже будет применяться для новых вставляемых строк.
begin; set local statement_timeout = '1s'; alter table email_stats add column emails_paid_clicks bigint default null; alter table email_stats alter column emails_paid_clicks set default 0; commit;
Отдельного пояснения заслуживает зачем я изменил statement_timeout в транзакции. Эта настройка ограничивает максимальное время выполнения запроса. Этот alter table всё равно требует блокировку на таблицу, хоть и на короткое время и здесь есть скрытые грабли: что если alter table не может взять блокировку из-за какой-то другой выполняемой транзакции? Например, простой insert в другой транзакции не позволит взять блокировку для изменения структуры. Но при этом запущенный alter table уже заблокирует все последующие пишущие запросы к этой таблице. Короткий statement_timeout быстро убьёт alter table и сервис продолжит работу. А попытку добавить поле можно безболезненно повторить чуть позже пока это в итоге не удастся.
Поле добавили, теперь default в данных
Длительный процесс, необходимо запросами
update email_stats set emails_paid_clicks = default where emails_paid_clicks is null and /* следующий кусочек данных */
проставить желаемое значение в имеющихся данных таблицы. Обновлять данные необходимо кусочками (для чего в запросе оставил открытое условие), делая паузы между обновлениями, следить за отставанием репликации (если такая есть) и за процессами autovacuum. Есть несколько подходов по самому обновлению, более простой будет обновлять по первичному или любому уникальному ключу. Берём любой язык программирования или сценариев по своему вкусу и делаем что-то такое:
$current_id = (select min(id) from email_stats) $maxid = (select max(id) from email_stats)
while ($current_id < $maxid) { $batch_to = $current_id + 10000 // максимальный размер пачки для одного обновления update email_stats set emails_paid_clicks = default where emails_paid_clicks is null and id >= $current_id and id < $batch_to
$current_id = $batch_to sleep(5) -- задержка между обновлениями чтобы меньше мешать сервису }
Во время выполнения такого скрипта можно изредка делать vacuum email_stats чтобы табличка не сильно увеличивалась в размерах. Особенно если autovacuum настроен недостаточно агрессивно и не успевает прибирать за скриптом.
Размер одного обновления и величину паузы между обновлениями нужно подбирать под профиль нагрузки конкретного сервиса. Маленькие обновления и большие паузы не будут никому мешать, но просто выполняться скрипт будет очень долго.
Пример запроса не самый эффективный, время его выполнения будет сильно плавать от пропусков id в данных и потому что данные скорей всего будут в разных страничках памяти, зато он простой и можно легко настраивать максимальный размер для одного обновления.
Из подводных камней на этом этапе: гораздо проще поймать deadlock, подравшись с приложением за обновление строк если приложение захочет обновить несколько строк из той же самой пачки, но в другом порядке. Можно поставить соединению, в котором работает скрипт этого обновления настройку deadlock_timeout = 100ms, тогда при взаимоблокировке будет как правило убиваться наш скрипт, а не полезная транзакция приложения.
Ставим not null
Теперь у нас в таблице не должно быть null значений в добавленном поле, можно проставить not null.
alter table email_stats alter column emails_paid_clicks set not null;
Этот запрос к сожалению поставит блокировку на запись. Но время выполнения куда меньше чем на обновление всей таблицы с перезаписью значения по умолчанию.
С минимальной блокировкой записи придётся отказаться от родного not null свойства, зато можно добавить check ограничение с аналогичным свойством. Сначала добавляем ограничение с указанием not valid (аналогично со statement timeout для транзакции)
begin; set local statement_timeout = '1s'; alter table email_stats add constraint emails_paid_clicks_not_null check (emails_paid_clicks is not null) not valid; commit;
Затем в другой транзакции уже без statement_timeout
alter table email_stats validate constraint emails_paid_clicks_not_null;
Проверка ограничения не заблокирует запись.
Готово
Всё, поле добавлено

Кстати, имеет смысл подумать, не использовать ли по-умолчанию именно NULL. Такое поле не только сильно проще добавляется, но и существенно компактнее хранится. Значение NULL - это один бит в битовой маске заголовка строки, Значение 0 типа bigint - уже занимает 8 байт.

Оптимизация алгоритма поиска первого вхождения элемента который не больше i-ого и его индекс больше i

Решал задачу и тут у меня получился time_lim, мне нужно оптимизировать этот алгоритм, чтоб он прошел 2 теста, не хватает 4-5 мс. Алгоритм ищет первое вхождения элемента который не больше i-ого и его индекс больше i, если его нет выводит -1.
int i(0),j(0); int n1; v_t v; //вектор типа int auto it(v.begin());
bool perd(int n) { ++j; if(n1>n) { cout<void fun(int n) { ++i; n1=n; it=find_if(v.begin()+i,v.end(),perd); if(it==v.end()) cout<<-1<<' '; j=i; }
void funcin(int &n) { cin>>n; }
int main() { cin >> n1; v.resize(n1); for_each(v.begin(),v.end(),funcin); for_each(v.begin(),v.end(),fun); return 0; }
Полный текст задачи:
Лайнландия представляет из себя одномерный мир, являющийся прямой, на котором располагаются N городов, последовательно пронумерованных от 0 до N - 1 . Направление в сторону от первого города к нулевому названо западным, а в обратную - восточным. Когда в Лайнландии неожиданно начался кризис, все были жители мира стали испытывать глубокое смятение. По всей Лайнландии стали ходить слухи, что на востоке живётся лучше, чем на западе. Так и началось Великое Лайнландское переселение. Обитатели мира целыми городами отправились на восток, покинув родные улицы, и двигались до тех пор, пока не приходили в город, в котором средняя цена проживания была меньше, чем в родном.


Ответ

Ваш алгоритм квадратичной сложности. Вот придумал только что интересный алгоритм для решения данной задачи, должен быть очень даже быстрым, он линейный:
Мы будем использовать стэк из чисел (простой вектор в который можно добавить и убрать с конца элемент). Суть алгоритма в том что мы находим участки со строгим возрастанием элементов, если участок вдруг прерывается, т.е. вдруг элемент меньше предыдущего элемента, тогда можно концевой части предыдущего возрастающего участка всем назначить что этот элемент ближайший меньший их всех. Т.е. вот алгоритм - движемся по массиву слева направо, при этом проверяем что пока в вершине стэка находится больший (текущего) элемент и стэк не пуст, то вытесняем из стэка элемент и назначаем этому элементу (стэковому) что ближайший к нему искомый это наш наблюдаемый элемент массива. В конце если стэк не пуст то всем его элементам назначаем что не найдено для них подходящего элемента т.е. ставим -1. Можно заметить что в стэке всегда находится нестрого возрастающая последовательность.
Такой алгоритм линейный (относительно размера массива N), т.к. он проходит по всем элементам массива ровно один раз и при этом из стэка делает не больше N добавлений и вытеснений и 2*N сравнений. Вот полный алгоритм на C++ (запустить онлайн на C++ и на Python):
#include #include using namespace std;
int main() { // nums - входные числа, stck - стэк, result - ответ vector nums, stck, result;
// Заполняем входной массив, можно через std::cin. nums = {1,2,3,2,1,4,2,5,3,1}; // Выдаёт -1 4 3 4 -1 6 9 8 9 -1 result.resize(nums.size(), -1);
// Основной алгоритм. for (size_t i = 0; i < nums.size(); ++i) { while (!stck.empty() && nums[stck.back()] > nums[i]) { result[stck.back()] = i; stck.pop_back(); } stck.push_back(i); }
// Выводим результат. for (size_t i = 0; i < result.size(); ++i) { cout << result[i] << " "; }
return 0; }

Как в Razor-разметке получить дополнительные поля авторизованного пользователя?

@User.Identity.Name по сути выдает логин. А как получить тот же Age к примеру?
public class User : IdentityUser { public int Age{ get; set; } public string FIO { get; set; } public string Addresses { get; set; } }


Ответ

По умолчанию используются только Name.
Класс SignInManager регистрирует пользователей в вашем приложении. Этот класс использует IUserClaimsPrincipalFactory для регистрации claim'ов. Чтобы добавить claim нужно реализовать свой IUserClaimsPrincipalFactory
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory { public AppClaimsPrincipalFactory( UserManager userManager , RoleManager roleManager , IOptions optionsAccessor) : base(userManager, roleManager, optionsAccessor) { }
public async override Task CreateAsync(ApplicationUser user) { var principal = await base.CreateAsync(user);
if (user.Age > 0) { ((ClaimsIdentity)principal.Identity).AddClaims(new[] { new Claim("age", user.Age.ToString()) }); }
return principal; } }
Далее регистрируем в классе Startup в методе ConfigureServices после добавления Identity.
public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders();
services.AddScoped, AppClaimsPrincipalFactory>();
... }
В представлении значение Age можно получить так:
@User.Claims.Where(c => c.Type == "age").Select(c => c.Value).SingleOrDefault();
Для удобства можно создать метод расширения:
public static class IdentityExtensions { public static string GetAge(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("age"); return (claim != null) ? claim.Value : string.Empty; } }
И использовать в представлении так:
@User.Identity.GetAge();

Архитектура сервиса по распознаванию образов

Вопрос к разработчикам проектов по распознаванию образов. Как лучше организовать архитектуру подобного сервиса?
Сейчас склоняюсь к решению использовать для работы с данными (а особенно для обучения) специализированные GPU-инстансы Amazon EC2 P2. На серверах установлено ПО только для работы искусственных нейронных сетей (Python, Anaconda, Keras, TensorFlow). В production-режиме сервер на вход принимает изображения с метаданными (как именно обработать изображение и какие данные вернуть), на выходе возвращает JSON-массив в зависимости от типа метаданных. Никакой особой логики там не хранится, вся аналитика происходит на серверах web-приложений.
Обучающие и тестовые выборки хранятся в отдельном кластере (обычные сервера с большим дисковым пространством). Туда же загружаются изображения из сети найденные собственными поисковыми ботами (через соцсети и поисковые системы).
Взаимодействие web-приложения с нейронной сетью осуществляется через API-запросы к GPU-серверам. Далее результат уже выдается на клиенты (аналогично с клиентов все идет на web-приложение, а затем на обработку в нейронную сеть).
Теперь основные вопросы:
На каком участке вы проводите аналитику? (например, чтобы определить, что на фотографии на человеке надет синий мужской пиджак к нейронной сети выполняется каскад запросов "поиск мужчины"->"поиск пиджака"->"определение цвета пиджака". для получения более высокого качества ответа и снижения нагрузки на сеть каждый запрос выполняется отдельно при утвердительном предыдущем). Имеет ли смысл реализовывать все варианты поиска в рамках единой нейросети или лучше создать множество отдельных нейросетей, заточенных под достаточно простые задачи? Как вы оптимизируете потребление ресурсов на этапах обучения и работы сети? Пока на уме только вариант с созданием специализированного GPU-кластера под обучение в рамках облачного хостинга и его периодическое включение по мере надобности (иначе дорого получается).


Ответ

Ваши вопросы говорят о том что, вы не осознаете всей сложности проблемы поиска мужчины на фото, не говоря уж о поиске пиджака. Хотя бы найти объект произвольного размера на фото по меркам на конец 2017 года - это уже передний край науки.
Сначала начните с простого. Попытайтесь хотя бы в общих чертах решить вашу проблему, о которой ни слова в вопросе. Арендуете ли вы для этого один сервер, или купите подходящую видеокарту - дело второе. Можно и без видеокарт. Как только вы поймете что для радикального уменьшения ошибки обучения вам нужны годы на ваших мощностях, тогда можно будет говорить об аренде кластера. И тогда вы можете обратиться к документации на TensorFlow чтобы узнать как конкретно решаются подобные проблемы.

Синхронизация межпроцесcного доступа к коду C#

Здравствуйте, просматривал такие понятия как Mutex, Semaphore, SemaphoreSlim, AutoResentEvent и т.д. В ходе разбирательств с ними возникли вот такие вопросы: 1) Если не дать Mutex имя, получается, что он начинает работать как обычный lock делать синхронизацию между потоками на уровне одного процесса, а межпроцессная синхронизация пропадает? То есть в таком случаи он ни чем не отличается от lock? 2) Вопрос похожий на предыдущий, Semaphore без задания имени он превращается в обычный loc только с поддержкой синхронизации нескольких потоков, хорошо, здесь понятно. Тогда получается от SemaphoreSlim он отличается лишь более сложным созданием т.к Semaphore(без имени) создается на уровне ядра и как следствие(из-за отсутствия имени) работает только для одного процесса(т.е толку от того, что он создается на уровни ядра никакого). Вот и получается, что SemaphoreSlim и Semaphore(без имени) буду работать одинаково, разве, что первый чуть быстрее. Правильно я понимаю расклад? Или же есть какое-то различие?


Ответ

Да, по смыслу неименованный Mutex — практически то же самое, что и блокировка через lock. Разница состоит в том, что
lock не работает через границы AppDomain'а, а неименованный Mutex доступен во всём процессе. Mutex является WaitHandle'ом, то есть вы можете, например, дожидаться его с таймаутом или ждать блокировки одного из нескольких Mutex'ов. lock реализован эффективнее, чем Mutex Разница между Semaphore и SemaphoreSlim примерно та же. Semaphore — обёртка над объектом Win32. SemaphoreSlim существенно быстрее, но он работает только внутри процесса и не экспортирует WaitHandle

Воздействие append на вид страницы

Всем привет, подскажите пожалуйста, почему при append результат отличается от статического html?
Я накидал пример для иллюстрации: https://www.w3schools.com/code/tryit.asp?filename=FLSELJ1WJACU
$("#test_jq").append("

"); $("#test_jq").append("
"); $("#test_jq").append("
"); $("#test_jq2").append("
"); $("#test_jq2").append("
"); $("#test_jq2").append("
"); .test { padding: 0; margin: 1px; position: relative; width: 100px; height: 120px; display: inline-block; background-color: pink; }

This is a Heading

Test preview

Test preview 2



Ответ

Достаточно занимательный пример. Когда вы ложите в статическую верстку чистые inline-block - с табуляцией(или пробелами, не важно) и переносами строк - вы потом увидите эти самые пробелы и переносы строк. Попробуйте добавить такое css правило:
div { font-size: 0; }
Просто когда вы делаете elem.append(childElem) - вы не добавляете переносов и пробелов, и всё отрабатывает как, по идее, и хочется.

Как проверить, если запущенна ли функция?

Господа, есть функция window.onscroll она запускается и если документ проскролен больше 200px то она запускает countRun() , а если меньше то countStop()
var p1 = document.querySelector('.p1'); var p2 = document.querySelector('.p2'); var wrapper = document.getElementById('wrapper'); var count = 0; var run; window.onscroll = function() { var scrolled = window.pageYOffset || document.documentElement.scrollTop; p1.innerHTML = scrolled; if (scrolled > 200) { countRun(); } else { countStop(); } } function countRun() { run = setInterval(function() { p2.innerHTML = count++; }, 1000) } function countStop() { count = 0; clearInterval(run); } * { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: #272727; perspective: 100px; color: white; } #wrapper { position: relative; width: 100%; height: 300%; } .p1 { position: sticky; width: 100px; height: 50px; left: 25px; top: 25px; background: rgba(0, 0, 0, .3); color: white; font-size: 20px; text-align: center; line-height: 2; transition: all .5s; } .p2 { position: sticky; width: 100px; height: 50px; left: 25px; top: 70px; background: rgba(0, 0, 0, .3); color: white; font-size: 20px; text-align: center; line-height: 2; transition: all .5s; }

0

0


Но как видно в примере, все работает не так хотелось бы. Догадываюсь, что в условии еще и надо проверить, если countRun() запущен и не запускать его больше, ну или что-то другое о чем я не догадываюсь...


Ответ

Проверить "запущена ли функция" невозможно. Можно проверить, "была ли запущена функция". Для этого функция сама должна себя где-то регистрировать.
В вашем случае, есть несколько решений. Первое, в лоб - нужно просто сбрасывать интервал, если счётчик уже был запущен. Второе, что почти то же самое, обнулять переменную run, и по ней определять, "была ли запущена функция".
var p1 = document.querySelector('.p1'); var p2 = document.querySelector('.p2'); var wrapper = document.getElementById('wrapper'); var count = 0; var run; window.onscroll = function() { var scrolled = window.pageYOffset || document.documentElement.scrollTop; p1.innerHTML = scrolled; if (scrolled > 200) { countRun(); } else { countStop(); } } function countRun() { if (run) return; // или // if (run) clearInterval(run); run = setInterval(function() { p2.innerHTML = count++; }, 1000) } function countStop() { count = 0; clearInterval(run); run = false; } * { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: #272727; perspective: 100px; color: white; } #wrapper { position: relative; width: 100%; height: 300%; } .p1 { position: sticky; width: 100px; height: 50px; left: 25px; top: 25px; background: rgba(0, 0, 0, .3); color: white; font-size: 20px; text-align: center; line-height: 2; transition: all .5s; } .p2 { position: sticky; width: 100px; height: 50px; left: 25px; top: 70px; background: rgba(0, 0, 0, .3); color: white; font-size: 20px; text-align: center; line-height: 2; transition: all .5s; }

0

0



Вариации на тему:
var p1 = document.querySelector('.p1'); var p2 = document.querySelector('.p2'); var wrapper = document.getElementById('wrapper'); class Counter { constructor(el, period = 1000) { this._el = el; this._period = period; this._run = false; this.clear(); } clear() { this._el.innerText = this.counter = 0; } inc() { this._el.innerText = ++this.counter; } start() { if (this._run) return false; this._run = setInterval(() => this.inc(), this._period); } stop() { if (this._run) clearInterval(this._run); this._run = false; this.clear(); } } let counter = new Counter(p2, 500); window.onscroll = function() { let scrolled = window.pageYOffset || document.documentElement.scrollTop; p1.innerText = scrolled; if (scrolled > 200) { counter.start(); } else { counter.stop(); } } * { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: #272727; perspective: 100px; color: white; } #wrapper { position: relative; width: 100%; height: 300%; } .sticky { position: sticky; background: rgba(0, 0, 0, .3); color: white; font-size: 20px; text-align: center; line-height: 2; transition: all .5s; width: 100px; height: 50px; } .p1 { left: 25px; top: 25px; } .p2 { left: 25px; top: 70px; }

0

0


Как заменить нулями данные в середине бинарного файла?

Есть ли стандартная для RedHat команда (кроме пары dd + truncate) для замены нулями данных в середине бинарного файла?


Ответ

Можно использовать однострочник на Python или другом скриптовом языке:
python -c "f=open('some','r+b');f.seek(123);f.write('\0'*4);"

Как изменить background option?

/*LANGUAGE PICKER*/ .select_join { width: 170px; height: 28px; overflow: hidden; background: url('http://www.freeiconspng.com/uploads/white-down-arrow-png-2.png') no-repeat 144px #141F26; border: #FEFEFE 1px solid; background-size: 10%; /*-webkit-box-shadow: inset 0px 0px 10px 1px #FEFEFE; box-shadow: inset 0px 0px 10px 1px #FEFEFE;*/ } .select_join select { background: transparent; width: 170px; color: #fff; border: 0; border-radius: 0; height: 28px; -webkit-appearance: none; } .select_join select:focus { outline: none; }



Привет. Как изменить background option на #141F26, но что бы при этом стрелка осталась белого цвета?


Ответ

.select_join select option{ background-color:#141F26; }
Что такое - "чтобы стрелка была белый"? Какой стрелка?
А-а, понял - стрелка "вниз" в селекте справа.

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

Как сделать пропуск лишних пробелов для введенного текста? Получилось написать для заданного.
#include using namespace std; #include #include
void main() { setlocale(0, "rus"); char nach1[] = "Its me Dio "; char con1[50]; int jj = 0;
for (int i = 0; i < strlen(nach1 - 1); i++) { if (nach1[i] == ' ' && nach1[i + 1] == ' ')continue; con1[jj] = nach1[i], jj++; }
con1[jj] = 0;
char* vr = con1; if (con1[0] == ' ')vr++;
cout << vr << endl << endl; _getch(); }


Ответ

Примерно так:
void removeSpaces(std::string& str) { for (std::string::iterator it = str.begin(); it != str.end(); it++) { std::string::iterator begin = it; while (it != str.end() && ::isspace(*it) )it++; if (it - begin > 1) it = str.erase(begin + 1, it) - 1; } }
Вход: str sdfg f
Выход: str sdfg f

Необработанное исключение. Не удалось загрузить файл или сборку

При запуске приложения на другом компьютере возникате ошибка: "Необработанное исключение. Не удалось загрузить файл или сборку", хотя на компьютере, на котором ведется разработка ничего подобного нет. Все dll находятся в папке с программой. Подскажите пожалуйста - что не так?


Ответ

Дело в том, что если у C++/CLI-сборки не находится одна из нативных зависимостей, загрузить её невозможно.
В случае управляемых зависимостей, загрузка откладывается до момента первого использования, и вы получаете сообщение о том модуле, который невозможно загрузить. Но нативные зависимости грузятся сразу. Раз вы их с собой не таскаете, то они должны быть проинсталлированы на целевой системе, а их отсутствие приводит к невозможности загрузить модуль.

Для определения недостающих зависимостей имеет смысл использовать Dependency Walker (обычно известный как depends.exe).

Сокращение времени билда приложения

Билд и запуск приложения в Android Studio 3.0 слишком долгий(иногда 20-25 минут) при развертывании на Android 4.3. При этом при развертывании этого же приложения, на устройствах с 5-6 андроидом билдится всего пару минут. От чего вообще может зависеть скорость билда? И как можно сократить это время, оптимизировать


Ответ

две полезные ссылки на эту тему:
https://developer.android.com/studio/build/optimize-your-build.html
https://medium.com/@kevalpatel2106/how-to-decrease-your-gradle-build-time-by-65-310b572b0c43
В частности почитайте как сделать профилирование билда. Как минимум локализуете проблему.
также может быть Вам поможет выделение модулей из проекта. Они будут кэшироваться и билдиться параллельно(если в gradle.properties пропишите org.gradle.parallel=true)
выжимка из второй статьи - измените gradle.properties так:
#Enable daemon org.gradle.daemon=true
# Try and findout the best heap size for your project build. org.gradle.jvmargs=-Xmx3096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# Modularise your project and enable parallel build org.gradle.parallel=true
# Enable configure on demand. org.gradle.configureondemand=true

Блокировать процесс пока не завершатся потоки/дочерние процессы

Есть такой код:
if(pid_t pid = fork()) // spawn child process { // parent process LOG("Try to execute smth. in child process"); return; } else { // child process doWork(); std::terminate(); }
Тут порождается дочерний процесс в котором выполняется некоторая работа. Где-то в другом месте(а именно в момент завершения процесса) есть такое:
// wait childern(some code may call fork()) const pid_t pid{::wait(nullptr)};
Здесь процесс ждет завершения дочерних процессов(которые нафоркались ранее). Так вот, все это удовольствие не работает вместе ключом -fsanintize=thread. Код зависает на wait, потому что компилятор добавляет некоторые дочерние процессы, которые сами не завершаются.
Вопрос. Как добиться аналогичного поведения без wait? Чтобы задачи запускались асинхронно, и главный процесс ждал завершения этих задач в случае прекращения работы. Может при помощи потоков, а не процессов. Если бы у меня в распоряжении был Qt, я бы закидывал эти doWork в QThreadPool и он бы в декструкторе ждал завершения всех задач. Но Qt у меня нет, а есть C++14 и pthread. Может кто-то предложить какое-нибудь решение?


Ответ

Накидал на скорую руку, но, думаю, идея понятна.
#include #include #include #include #include #include #include #include
class fork_storage { public: fork_storage() noexcept { m_pid = fork(); }
fork_storage(const fork_storage&) = delete; fork_storage& operator=(const fork_storage&) = delete; fork_storage& operator=(fork_storage&& rhv) = delete;
fork_storage(fork_storage&& src) noexcept { m_pid = src.pid(); src.reset(); }
~fork_storage() { if (is_parent()) { wait(); } }
bool fail() const noexcept { return m_pid < 0; }
bool is_parent() const noexcept { return m_pid > 0; }
void reset() noexcept { m_pid = -1; }
pid_t pid() const noexcept { return m_pid; }
int wait() noexcept { int status = -1; if (is_parent()) { waitpid(m_pid, &status, WUNTRACED); } reset(); return status; }
private: pid_t m_pid; };

std::mt19937 &random_gen() { static std::mt19937 gen(std::chrono::system_clock::now().time_since_epoch().count()); return gen; }

int main() { std::vector processes; for (unsigned i = 0; i < 10; ++i) { fork_storage fork_obj; if (fork_obj.fail()) { std::cerr << "fork error
"; } else { if (fork_obj.is_parent()) { std::string message = "process created: " + std::to_string(fork_obj.pid()) + "
"; processes.emplace_back(std::move(fork_obj)); } else { for (auto &process: processes) { process.reset(); } processes.clear(); std::chrono::seconds sec(random_gen()() % 5 + 1); std::string message = "child " + std::to_string(getpid()) + " paused: " + std::to_string(sec.count()) + " sec
"; std::cout << message; std::this_thread::sleep_for(sec); break; } } }
while (!processes.empty()) { fork_storage &fork_obj = processes.back(); if(fork_obj.is_parent()) { std::string message = "wait process: " + std::to_string(fork_obj.pid()) + "
"; std::cout << message; } processes.pop_back(); } }
http://rextester.com/LUZI37730

Как данный пример анимации CSS сделать на чистом SVG SMIL

Как данный пример полностью реализовать на svg, без единой строчки css. css можно стилизовать только сам тег svg
*, * ::after, *::before { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: #272727; color: white; } #wrapper { width: 100%; height: 100%; } #iconWrapper { position: relative; margin: 50px 0 0 50px; width: 50px; height: 45px; border: 1px solid white; } .iconLine { position: absolute; margin-left: 5px; width: 40px; height: 5px; background: #fff; transition: transform .5s, background .1s .3s, top .5s .5s; } .lineOne { top: 5px; } .lineTwo { top: 20px; } .lineThree { top: 35px; } #iconWrapper:hover .lineOne { top: 20px; transform: rotateZ(-45deg); transition: transform .5s .5s, top .5s; } #iconWrapper:hover .lineTwo { top: 20px; background: transparent; transition: transform .5s .5s, background .5s .3s, top .5s; } #iconWrapper:hover .lineThree { top: 20px; transform: rotateZ(45deg); transition: transform .5s .5s, top .5s; }



Ответ

Чтобы было легче сравнивать команды анимации CSS и SVG,- наименования классов, уникальных идентификаторов будут одинаковы в обоих примерах. Анимацию SVG можно сделать по разному, очень коротким кодом, но опять же, для лучшего понимания будем делать подробно, последовательно и нудно.
Линии нарисованы с помощью ширина линий задана - stroke-width="4"

Для повторения примера анимации на CSS, необходимо сделать несколько последовательных анимаций SVG:
Верхняя и нижняя линии сдвигаются навстречу друг другу в одну позицию со средней линией. Средняя линия исчезает, так как её не должно быть видно при повороте крайних линий Поворот одной линии против часовой стрелки на -45° Поворот второй линии по часовой стрелке на 45° Обратный поворот наклонных линий в горизонтальное положение. Появление средней линии Возврат первой и третьей линии на исходную позицию
#1. Анимация начинается после клика по чёрному квадрату. begin="iconWrapper.click"

К первой анимации придётся давать много пояснений, дальше пойдёт легче
pointer-events="none" Так как белые линии находятся выше чёрного квадрата, необходимо сделать их прозрачными для клика, если курсор попадает на них. Другими словами,- клик, как команда для начала анимации сработает при любом расположении курсора, хоть на белых линиях, хоть на чёрном фоне.
attributeName="points" - атрибут, который будет анимироваться,- внутри него набор координат начальной и конечной точек одной линии - .
values="5 10 45 10;5 25 45 25" - до точки запятой координаты линии в начальном положении, после точки с запятой координаты в конечном положении.
fill="freeze" - заморозка линии в конечном положении. restart="never" - защита от повторного мгновенного клика, иначе начнется повторная анимация не дожидаясь окончания исходной анимации.
#2. Средняя линия исчезает, так как её не должно быть видно при повороте крайних линий

Анимации исчезновения средней линии не видно, так как средняя линия находится под другими линиями, но её следует убрать заранее до вращения других линий.
attributeName="opacity" values="1;0" - прозрачность линии изменяется от нуля до 100% begin="an1_Line3.end" - начало анимации сразу после завершения предыдущей анимации, сближения линий.
#3. Поворот одной линии против часовой стрелки на -45° #4. Поворот второй линии по часовой стрелке на 45°

type="rotate" values="0 25 25; 45 25 25" - поворот по часовой стрелке на 45° группа цифр после точки с запятой - конечное положение линии45 25 25 - угол и координаты центра вращения. begin="hide.end" - анимация вращения начнется по окончанию анимации сокрытия линии
#5. Обратный поворот наклонных линий в горизонтальное положение. #6. Появление средней линии #7. Возврат первой и третьей линии на исходную позицию

SVG SMIL анимация,- это декларативная анимация. Поэтому у неё нет переменных. То есть негде хранить и считать клики в интерактивном режиме анимации. Поэтому для выполнения таких действий, как в примере автора вопроса, необходимо всё таки подключать или CSS в виде скрытых чекбоксов или JS.
SVG хорошо работает в паре c CSS, JS. Стили CSS можно добавлять внутри файла SVG в стилях представления:
вот так:

или так:

или добавлять стили внутри файла svg:

Вот перевод отличной статьи , в которой автор - Sara Soueidan, попыталась кратко и доходчиво на примерах изложить основы анимации:
Руководство по анимации SVG (SMIL)

Cоздание индивидуального ползунка “

Здравствуйте, необходимо сделать ползунок с индивидуальным дизайном. Поэтому input type=range не подойдет, пробовал использовать jQueryUI, но он тоже не предоставляет нужный уровень кастомотизации. В итоге пришел к варианты создание ползунка из двух объектов тега div, поэтому вопрос такой:
Существуют ли готовые библиотеки или же плагины позволяющие настроить собственный ползунок, или же придется все писать в ручную?
Заместо ползунка должна быть грубо говоря картинка


Ответ

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

Вот пример с индивидуальным дизайном. Здесь на range thumb наложен div с картинкой. Правда здесь есть и js код для еще более красивой реализации прокрутки ползунка. Но вообще можно задать стили и без этого.
Здесь картинка другая чем автор хотел. но вообще принцип наверное будет понятен.
function showValue(val,slidernum,vertical) { /* setup variables for the elements of our slider */ var thumb = document.getElementById("sliderthumb" + slidernum); var shell = document.getElementById("slidershell" + slidernum); var track = document.getElementById("slidertrack" + slidernum); var fill = document.getElementById("sliderfill" + slidernum); var rangevalue = document.getElementById("slidervalue" + slidernum); var slider = document.getElementById("slider" + slidernum); var pc = val/(slider.max - slider.min); /* the percentage slider value */ var thumbsize = 40; /* must match the thumb size in your css */ var bigval = 250; /* widest or tallest value depending on orientation */ var smallval = 40; /* narrowest or shortest value depending on orientation */ var tracksize = bigval - thumbsize; var fillsize = 16; var filloffset = 10; var bordersize = 2; var loc = vertical ? (1 - pc) * tracksize : pc * tracksize; var degrees = 360 * pc; var rotation = "rotate(" + degrees + "deg)"; rangevalue.innerHTML = val; thumb.style.webkitTransform = rotation; thumb.style.MozTransform = rotation; thumb.style.msTransform = rotation; fill.style.opacity = pc + 0.2 > 1 ? 1 : pc + 0.2; rangevalue.style.top = (vertical ? loc : 0) + "px"; rangevalue.style.left = (vertical ? 0 : loc) + "px"; thumb.style.top = (vertical ? loc : 0) + "px"; thumb.style.left = (vertical ? 0 : loc) + "px"; fill.style.top = (vertical ? loc + (thumbsize/2) : filloffset + bordersize) + "px"; fill.style.left = (vertical ? filloffset + bordersize : 0) + "px"; fill.style.width = (vertical ? fillsize : loc + (thumbsize/2)) + "px"; fill.style.height = (vertical ? bigval - filloffset - fillsize - loc : fillsize) + "px"; shell.style.height = (vertical ? bigval : smallval) + "px"; shell.style.width = (vertical ? smallval : bigval) + "px"; track.style.height = (vertical ? bigval - 4 : fillsize) + "px"; /* adjust for border */ track.style.width = (vertical ? fillsize : bigval - 4) + "px"; /* adjust for border */ track.style.left = (vertical ? filloffset + bordersize : 0) + "px"; track.style.top = (vertical ? 0 : filloffset + bordersize) + "px"; } /* we often need a function to set the slider values on page load */ function setValue(val,num,vertical) { document.getElementById("slider"+num).value = val; showValue(val,num,vertical); } document.addEventListener('DOMContentLoaded', function(){ setValue(88,1,false); }) .slider{ position:absolute; left:0px; top:0px; overflow:visible; z-index:100; } .slidershell { border:0 none; position:relative; left:0px; top:0px; overflow:visible; } .slidertrack { border:2px outset #666; border-radius:4px; position:absolute; } .sliderfill { border:2px solid #00767f; border-radius:4px; position:absolute; opacity:0.2; pointer-events:none; background:#00767f; background: linear-gradient(90deg,#005555,#006699); } .sliderthumb { width:40px; height:40px; background-image:url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/358203/thumb.png'); background-size: 40px 40px; background-position:0px 0px; background-repeat: no-repeat; background-color:transparent; position:absolute; left:0px; top:0px; border:0 none; padding:0px; margin:0px; text-align:center; pointer-events:none; } .slidervalue { width:40px; height:40px; line-height:40px; color:#fff; font-family:helvetica,sans-serif; font-size:18px; position:absolute; left:0px; top:0px; border:0 none; padding:0px; margin:0px; text-align:center; pointer-events:none; } /*For IE*/ input[type=range]::-ms-track { width:100%; height:100%; -webkit-appearance:none; margin:0px; padding:0px; border:0 none; background:transparent; color:transparent; overflow:visible; } input[type=range]::-moz-range-track { width:100%;height:100%; -moz-appearance:none; margin:0px; padding:0px; border:0 none; background:transparent; color:transparent; overflow:visible; } input[type=range] { width:100%;height:100%; -webkit-appearance:none; margin:0px; padding:0px; border:0 none; background:transparent; color:transparent; overflow:visible; } input[type=range].slidervertical { -webkit-appearance: slider-vertical; writing-mode: bt-lr; /* IE */ opacity:0.01; } input[type=range]:focus::-webkit-slider-runnable-track { background:transparent; border:transparent; } input[type=range]:focus { outline: none; } input[type=range]::-ms-thumb { width:40px;height:40px; border-radius:0px; border:0 none; background:transparent; } input[type=range]::-moz-range-thumb { width:40px;height:40px; border-radius:0px; border:0 none; background:transparent; } input[type=range]::-webkit-slider-thumb { width:40px; height:40px; border-radius:0px; border:0 none; background:transparent; -webkit-appearance:none; } input[type=range]::-ms-fill-lower {background:transparent;border:0 none;} input[type=range]::-ms-fill-upper {background:transparent;border:0 none;} input[type=range]::-ms-tooltip { display: none;} body {font-family:sans-serif;} .slider2column, td, tr, th { width:400px; border:0 none !important; }

0

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

Дождались.)))
Вот и сам пример.
input[type=range] { -webkit-appearance: none; width: 100%; margin: 50px 0; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { width: 100%; height: 8.4px; cursor: pointer; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } input[type=range]::-webkit-slider-thumb { height: 50px; width: 50px; border-radius: 3px; background-color: transparent; background: url(https://i.stack.imgur.com/QneFV.png) center center no-repeat; cursor: pointer; -webkit-appearance: none; margin-top: -23px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #367ebd; } input[type=range]::-moz-range-track { width: 100%; height: 8.4px; cursor: pointer; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } input[type=range]::-moz-range-thumb { height: 50px; width: 50px; border-radius: 3px; background-color: transparent; background: url(https://i.stack.imgur.com/QneFV.png) center center no-repeat; cursor: pointer; -webkit-appearance: none; margin-top: -23px; } input[type=range]::-ms-track { width: 100%; height: 8.4px; cursor: pointer; background: transparent; border-color: transparent; color: transparent; } input[type=range]::-ms-fill-lower { background: #2a6495; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } input[type=range]::-ms-fill-upper { background: #3071a9; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } input[type=range]::-ms-thumb { height: 50px; width: 50px; border-radius: 3px; background-color: transparent; background: url(https://i.stack.imgur.com/QneFV.png) center center no-repeat; cursor: pointer; -webkit-appearance: none; margin-top: -23px; } input[type=range]:focus::-ms-fill-lower { background: #3071a9; } input[type=range]:focus::-ms-fill-upper { background: #367ebd; }

Как в Delphi сделать окно всегда неактивным

То есть даже при нажатии кнопки внутри окна оно само не должно становиться активным. Подходит любое решение, через WinAPI в том числе.
Фреймворк FMX


Ответ

Для VCL Вам нужно у формы переопределить метод CreateParams и в поле Params.ExStyle добавить флаг WS_EX_NOACTIVATE
procedure TForm1.CreateParams(var AParams: TCreateParams); begin inherited CreateParams(AParams); AParams.ExStyle := AParams.ExStyle or WS_EX_NOACTIVATE; end; При работе с WinAPI этот флаг нужно добавить в первый параметр функции CreateWindowEx() Для FMX, исходя из метода TPlatformWin.CreateWindow вы параметр ExStyle не переопределите
Если отказаться от кроссплатфоменности FMX, то для созданного окна можно поменять параметр EX_STYLE вызвав функцию SetWindowLongPtr
procedure MakeNoActivate(AWnd: HWND); var LOldVal: NativeInt; begin LOldVal := GetWindowLongPtr(AWnd, GWL_EXSTYLE); SetWindowLongPtr(AWnd, GWL_EXSTYLE, LOldVal or WS_EX_NOACTIVATE); end;
Получить HWND у FMX формы можно так
uses FMX.Platform.Win; ............ var LWnd: HWND begin LWnd := FmxHandleToHWND(Form1.Handle); ................ end;

Что такое WinRT и с чем его едят?

Рихтер в своей книге целую главу посвятил данному механизму, но я так и не понял в каких сценариях его имеет смысл применять.
Это что-то типа убийцы COM, который нужно применять для межязыкового взаимодействия между управляемым модулем и неуправляемым? Или это вообще какая-то обертка над WinApi?


Ответ

На самом деле, WinRT не является заменой или оберткой для какой либо из предыдущих технологий. WinRT - это принципиально новая технология, направленная на разработку приложений, которые имеют смысл на разных типах устройств. Приложение WinRT может использовать базовый API и работать на всех типах устройств, или использовать расширения API и работать под набором конкретных устройств (например, под ПК и смартфоном, ПК и Xbox и т.п.)
Первоначально эта технология возникла под Windows 8 и называлась WinRT. Позднее в Windows 10 она была заменена на аналогичную технологию UWP, которая охватывает больший набор устройств. Сейчас можно приближенно считать, что это одно и то же.
Приложения UWP/WinRT обладают следующими особенностями:
Взаимодействие с ОС с помощью специального API Windows Runtime или ограниченного подмножества разрешенных API из Win32/COM и .NET Запуск в ограниченной среде, где приложения не имеют прямой доступ к оборудованию, реестру, всей файловой системе и т.п. WinRT приложения имеют доступ только к своей папке данных, а к другим папкам могут получать доступ с явного разрешения пользователя Распространение преимущественно через Магазин Windows, подобно распространению мобильных приложений, в противоположность обычному скачиванию инсталляторов с разных сайтов Разработка может осуществляться либо на С++ (с расширениями С++/CX для взаимодействия с компонентами WinRT), либо на .NET-языках Построение графического интерфейса с помощью XAML-фреймворка, похожего на WPF. В отличие от WPF, приложение строится не как набор окон, а как набор страниц, между которыми пользователь переходит внутри одного окна (как в веб-приложениях). Это позволяет создавать адаптивный интерфейс, имеющий смысл на разных типах устройств.
WinRT не является "убийцей COM", что бы это не значило. COM жив и будет жить, более того, сами компоненты WinRT API внутри представляют из себя COM-объекты. WinRT-приложения, написанные на С++, могут взаимодействовать с ними либо традиционно, как с COM-объектами, либо с использованием специальных расширений языка C++/CX.
WinRT не является "убийцей WinAPI", что бы это не значило. WinRT приложения, написанные на С++, могут как обычно взаимодействовать с подмножеством разрешенных Win32/COM API. Например, функция CreateFile будет доступна, а функции работы с реестром - нет. Конечно, это не позволяет обойти ограничения платформы, т.е. функция CreateFile также будет работать только с файлами в разрешенных папках. Забавный факт: в WinRT нельзя этой функцией открыть устройство NUL, как следствие - код, написанный из предположения, что оно всегда доступно, сломается при портировании под WinRT
WinRT не является средством для организации взаимодействия между управляемым и неуправляемым кодом (в целом). Тем не менее, расширения языка C++/CX предоставляют возможность организовать взаимодействие между кодом на стандартном С++ и компонентами WinRT.
Подробнее: Введение в работу с UWP приложениями

error: cannot spawn git: Function not implemented

Я на хероку хочу закинуть своего бота и вот когда пишу
git push heroku master
выводит
error: cannot spawn git: Function not implemented
Как это решить ?
Версия гит 2.16.1, ОС--Windows7 x64


Ответ

Это баг в свежем обновлении дистрибутива, проявляется на 2.16.1 и 2.16.2
Об этом же пишут коллеги на en so и уже появлся issue на гитхабе
Либо ждите исправления, либо временно установите более раннюю версию.
Если есть аккаунт на гитхаб – можете в том issue указать, что проблема воспроизводится не только на Windows Server 2008, но и на вашей Windows 7 x64.

Как можно обойти принудительное завершение параллельного потока после завершения главного JAVA

Я делаю асинхронный метод, который создает новый поток и, собственно, выполняет метод асинхронно. Распараллеливаю поток с помощью класса CompletableFuture.
Столкнулся с такой проблемой, что если асинхронный метод не успевает завершиться раньше главного потока, то при завершении главного потока, принудительно завершается и мой асинхронный метод. Конкретно не работает при исполнении в обычных классах.
Пробовал на servlet'ах, асинхронный метод успешно доходит до своего логического завершения вне зависимости от главного потока.
Если сталкивались с таковым, с радостью почитаю ваши решения и предложения.
Возможно, будет понятнее, если я приведу пример. Мой асинхронный метод тратит на обработку 20 секунд, но главный метод заканчивается раньше и обрубает работу асинхронного.
public class SomeClass {
public static void main(String[] args) { SomeClass.waitAsync(); System.out.println("main thread finished"); }
public static CompletableFuture waitAsync() {
CompletableFuture completableFuture = CompletableFuture .supplyAsync(() -> threadWait());
return completableFuture;
}
public static boolean threadWait() {
try { System.out.println("Async method started"); Thread.sleep(20000); System.out.println("Async method finished"); return true; } catch (InterruptedException e) { e.printStackTrace(); return false; } }
}
Таким образом, в консоль выведется:
Async method started main thread finished


Ответ

Вся проблема в том, что CompletableFuture supplyAsync(Supplier supplier) использует внутри себя ForkJoinPool.commonPool(). [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#supplyAsync-java.util.function.Supplier-][1] А вот джавадок для ForkJoinPool.commonPool() https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html#commonPool-- То есть всё умирает, когда кончается метод main. Добавьте логирование в вашу лямбду, и вы увидите, что внутри supplyAsync(Supplier supplier) орудует daemon-тред.
.supplyAsync(() -> { System.out.println("Current thread is daemon: " + Thread.currentThread().isDaemon()); return threadWait(); });
Получим:
Current thread is daemon: true Async method started main thread finished
Так как JVM сворачивается, не дожидаясь завершения daemon-тредов, очевидно, что ждать завершения работы в supplyAsync в данном случае никто не будет.
Выход - использовать перегруженный метод supplyAsync(Supplier supplier, Executor executor), передав ему какой-нибудь экзекьютор, который оперирует non-daemon тредами, например:
public static CompletableFuture waitAsync() {
CompletableFuture completableFuture = CompletableFuture .supplyAsync(() -> { System.out.println("Current thread is daemon: " + Thread.currentThread().isDaemon()); return threadWait();}, Executors.newSingleThreadExecutor());
return completableFuture;
}
Аутпут:
Current thread is daemon: false Async method started main thread finished Async method finished
UPD Как совершенно справедливо отметил @Artem Konovalov, если мы передаём в метод свой Executor и просто забываем о нём, программа никогда не завершится самостоятельно, т.к. треды в пуле сами не умрут. Поэтому необходимо сохранить ссылку на передаваемый ExecutorService и завершить его работу самостоятельно. Например, так:
public static void main(String[] args) { ExecutorService executorService =Executors.newSingleThreadExecutor(); waitAsync(executorService); executorService.shutdown(); System.out.println("main thread finished"); }
public static CompletableFuture waitAsync(ExecutorService executor) {
CompletableFuture completableFuture = CompletableFuture .supplyAsync(() -> threadWait(), executor);
return completableFuture;
}
В данном случае программа дождётся завершения задачи и завершится. Вообще, тут достаточно много нюансов. Боюсь, в одном вопросе/ответе всё не охватить.

Преобразование юникод–строки в исходное понятное человеку представление

На входе имеется массив «строк» (юникод–объектов):
words = [u"привет", u"мир"]
Моя задача — хитрым образом обработать их как одну строку:
text = process_text(u' '.join(words))
Далее разбить обратно на слова и поместить в список:
words = [word for word in text.split()]
Проблема в том, что на последнем этапе после выполнения метода split, строки из u"привет" и u"мир" превращаются в u'\u043f\u0440\u0438\u0432\u0435\u0442' и u'\u043c\u0438\u0440', но мне необходимо иметь исходное представление. Каким образом этого добиться?
Обновление
Для выявления проблемного места ставил вывод строки в консоль. Перед process_text, строка выводится в нужном формате, после — тоже, проблема появляется только после метода split.
Обновление 2
На всех этапах тип переменной text – . Если сравнить «человеческое представление» и юникод–строку "привет", то сравнение работает верно. На данной стадии решения вопроса хотелось бы все–таки как–то получить не юникод–строку, а человеческое представление.


Ответ

Проблемы с выводом, как оказалось, заключается в том, что в Python 2 необходимо выводить именно строку, а не массив (в Python 3 вывод массива через print работает превосходно).
То есть надо не
print(words)
Надо
print(u' '.join(words))
Тогда выводимая строка содержит "привет мир"

Книга по веб-стандартам? [закрыт]

Подскажите, пожалуйста, хочу прочитать или книгу или документацию по веб-стандартам, чтобы я мог аргументировать почему в форме справа кнопка сохранить, а слева отменить(это например) и тд. Что посоветуете?


Ответ

То, что вам нужно, называется User Interface Guidelines. Однако для web-а нет никаких документально зафиксированных рекомендаций, поэтому можете поискать подобные документы для широко используемых настольных операционных систем, опыт взаимодействия с которыми является стандартом де-факто:
User Experience Guidelines для Windows, Human Interface Guidelines для OS X.

css vs svg для создания простых изображений

На странице требуется создать несколько (не больше сотни точно, скорее десяток) интерактивных рисунков (надписи и некоторые элементы могут быть кнопками/ссылками)

Подскажите, что лучше использовать css или svg. Лично пока склоняюсь к css + jQuery для позиционирования элементов


Ответ

Для графики, где много линий, кругов, фигур со сложными контурами лучше использовать SVG. Графика должна быть векторной. Не надо ставить вопрос,- только SVG или только CSS и JS . Вся эта троица прекрасно дополняет друг друга. В вашем примере, конечно лучше использовать SVG. Узоры повторяются, значит нужно использовать pattern, в который необходимо поместить одно звено цепи, а потом автоматически заполнять выбранный регион элементом паттерна. Заполнение паттерном идет по рядам, слева направо, после заполнения одного ряда, начинается заполнение следующего ряда. Подробнее о svg патернах здесь и здесь
Ниже пример кода для одного звена:
#bigCircle { fill:none; stroke:#3D6B93; } #leftCircle, #rightCircle { fill:#3D6B93; } #centerCircle { fill:#01AA4D; }
В секции ... с помощью базовых фигур создаем элемент паттерна. Он не будет виден до тех пор пока мы не используем его для заполнения какой-то фигуры. Фигура внутри паттерна может иметь любые очертания, но она всегда заключена в прямоугольник, который должен быть не меньше габаритных размеров самой фигуры. В нашем случае размеры паттерна определяют width="106" height="16"
Команда заполнения паттерном :

Габаритные размеры прямоугольника равны размерам паттерна, поэтому разместилось одно звено.
Для увеличения количества звеньев просто увеличим ширину прямоугольника. Понятно, чтобы не было обрезки последней фигуры, необходима кратность размеров
Пример с пятью звеньями
#bigCircle { fill:none; stroke:#3D6B93; } #leftCircle, #rightCircle { fill:#3D6B93; } #centerCircle { fill:#01AA4D; }
И ещё один пример с многорядовым заполнением:
#bigCircle { fill:none; stroke:#3D6B93; } #leftCircle, #rightCircle { fill:#3D6B93; } #centerCircle { fill:#01AA4D; }
Решение полностью адаптивно, работает во всех браузерах, включая IE11, Edge

FileStream и пути длинною >260 символов

Сначала программа валилась на получении списка фалов через Directory.GetFiles с PathTooLongException
Почитал и нашел информацию, о том, что ограничение сняли в последних фреймворках.
Хорошо, сменил версию, но теперь при создании FileStream вылетает System.IO.DirectoryNotFoundException. с таким стеком:
в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) в System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) в System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) в MD5Calculator.Program.Main(String[] args) в E:\Projects!My Projects\MD5Calculator\MD5Calculator\Program.cs:строка 36
Проверил валидность пути путем открытия файла и он успешно открылся.
Получается FileStream не поддерживает длинные пути? Как уйти от этого?
UPD
Минимальный код:
var filePath = @"\\?\"+Path.Combine(fileList.Key, list[i].FileName); using (var stream = new FileStream(filePath, FileMode.Open,FileAccess.Read, FileShare.ReadWrite)) {
}
Добавление @"\\?\" поменяло исключение на
System.IO.IOException: 'Синтаксическая ошибка в имени файла, имени папки или метке тома
Может быть с шарой такое не работает?
Вот еще пример пути, который вызывает проблему и я немного обфуцировал звездочками:
\\******\********\*******\*******************\****************\******\********** *********\image0000015B0000018B0000027B0000041B0000042B0000046B0000099B0000303B0000363B0000380B0000484B0000563B0000569B0000958B0000959B0000972B0001164B0000025B0000050B0000149A.jpg


Ответ

Для использования длинных сетевых путей к ним добавляется префикс \\?\UNC\. См. Naming Files, Paths, and Namespaces
А почему майки могли побоятся заложить эту логику внутрь, что бы внутри все функции сами при необходимости выполняли дополнение?
Главным образом, из-за обратной совместимости. Вероятно, какие-то программы могут повести себя странно, если просто так отменить это ограничение. На самом деле, в Windows 10 есть возможность использовать длинные пути без префикса, но для этого нужно задать несколько настроек, как на уровне ОС так и в манифесте приложения: .NET 4.6.2 and long paths on Windows 10.

Как перемещать дочерний элемент по клику в js?

Дан блок box шириной и высотой 400px, внутри которого находится зеленый квадрат шириной 50px child, необходимо при нажатии на любую область родительского блока box чтобы дочерний элемент child переместился в место клика. Запуталась в js коде.
let box = document.getElementById('box'); let child = document.getElementById('child'); child.onmousemove = funcMouse; child.style.top = (event.clientY - 50) + 'px'; child.style.left = (event.clientX - 25) + 'px'; function funcMouse(event) { this.innerHTML = event.clientX + ' - ' + event.clientY; } #box { position: relative; width: 400px; height: 400px; border: 1px solid black; } .child { position: fixed; width: 50px; height: 50px; background: green; }



Ответ

Ошибок больше чем кода...
let box = document.getElementById('box'); // child - это class, но почему-то ты ищешь этот элемент по ID //let child = document.getElementById('child'); let child = document.getElementsByClassName('child')[0]; //Если меняешь положение элемента по клику при чем тут событие mousemove? box.addEventListener('click', function() { // значения надо менять в пределах функции child.style.top = (event.clientY - 25) + 'px'; child.style.left = (event.clientX - 25) + 'px'; child.innerHTML = event.clientX + ' - ' + event.clientY; }); #box { position: relative; width: 400px; height: 400px; border: 1px solid black; } .child { /* а почему не absolute раз перетаскиваешь элемент в пределах родителя */ position: fixed; width: 50px; height: 50px; background: green; /*а если еще добавть transition то переход будет плавным*/ transition: all .3s; }


Уменьшить svg картинки пропорционально

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


Ответ

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

Как увеличить сочность цвета (scss)?

Допустим имеется цвет #ff7fa1, как средствами scss
Увеличить его сочность до максимального уровня #ff0044? Уменьшить его сочность до минимального уровня #ffffff?



Ответ

Можно обратиться к цветовой схемеhsl
При этом максимальная сочность цвета будет при значении 50% для l компоненты и минимальная (белый цвет) - при значении 100%.
В SASS есть функция получения l компоненты: lightness($color)
А также функции для изменения этой компоненты:
lighten($color, $amount) darken($color, $amount)
Таким образом для решения пункта два, нужно дополнить значение компоненты до 100, а для решения первого пункта в случае если текущее значение больше 50 - уменьшить, в противном случае - увеличить до 50.
Пример использования:
.c1{ color: lighten($color, 100-(lightness($color))); }
.c2{ $l : lightness($color); color: if($l > 50, darken($color, ($l)-50), lighten($color, 50-($l))); }
При $color: #ff7fa1 преобразуется в следующее:
.c1 { color: white; }
.c2 { color: #ff0044; }
используется функция if