Страницы

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

понедельник, 2 марта 2020 г.

Получить корень n-ой степени

#javascript


Как можно получить корень n-ой степени числа x в JavaScript?
    


Ответы

Ответ 1



Для частных случаев квадратного и кубического корня стоит использовать методы Math.sqrt и Math.cbrt соответственно. В общем случае корень n-ой степени числа x равен числу x в степени 1/n, поэтому можно использовать метод Math.pow или оператор возведения в степень **: Math.pow(x, 1/n) // или x ** (1/n) Например: console.log(Math.pow(81, 1/4)); console.log(81 ** (1/4)); Для отрицательных x предложенный способ вернёт NaN, что соответствует определению корня (над действительными числами) для всех случаев кроме нечётных n. При отрицательных x и нечётных n можно написать проверку: function nthRoot(x, n) { if (x < 0 && n % 2 === 1) return -Math.pow(-x, 1/n); else return Math.pow(x, 1/n) }

Лямбда-выражения и управляемый код

#cpp #cpp_cli


Имеется класс C++, написанный с применением управляемого кода. И вот нелегкая привела
меня вызвать в данном классе в одном из методов любой из std::algorithm. Так вот, студия
любезно указала, что лямбда - выражения использовать нельзя. Пришлось написать класс,
и сделать его функтором. Так вот вопрос - почему запрещены лямбды?

Код:

public ref class edit_base
{
public:
    void test()
    {
        std::string line("abcdefg");
        std::string lineNew;
        std::copy_if(line.begin(), line.end(), std::back_inserter(lineNew), [](const
char& s) {
            if (s > 10 && s < 100)
                return true;
            return false;
        });
    }
 }


Пишу через 17 студию. Компилятор: 19.11.25547


  Error: E2093   локальное лямбда-выражение не допускается в функции-члене класса
управляемый

    


Ответы

Ответ 1



Да, это так. Лямбды компилируются как нативный локальный класс/структура, а такого не может быть внутри управляемого класса. Поэтому придётся вынести нужный метод наружу: ref class edit_base; void test(edit_base^ self) { // тут можно обращаться к полям класса (если надо, объявите эту функцию friend'ом) std::string line("abcdefg"); std::string lineNew; std::copy_if(line.begin(), line.end(), std::back_inserter(lineNew), [](const char& s) { if (s > 10 && s < 100) return true; return false; }); } public ref class edit_base { public: void test() { ::test(this); } };

Можно ли установить `inputType` для клавиатуры в WebView?

#java #android #webview #android_webview #uiwebview


В апплекации есть реализация WebView в котором есть поля для заполнения. Так вот
вопрос в том, можно ли, чтоб при нажатии юзером на поле с указанием номера телефона
открывалась клавиатура с типом android:inputType="number" ?
    


Ответы

Ответ 1



Попробуйте так Создайте подкласс WebView и переопределите метод onCreateInputConnection. Этот метод вызывается при выборе поля ввода в WebView и дает возможность настроить способ обработки события. @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { BaseInputConnection ic = new BaseInputConnection(this, true); outAttrs.inputType = InputType.TYPE_CLASS_NUMBER; // Tells the keyboard to show the number pad return ic; } Источник

Как лучше реализовать масштабирование свеч на графике

#c_sharp #wpf #график #wpf_canvas


Нарисовал свой график на панели Canvas.
Как его рисовал я - Есть массив всех свеч, и я вывожу на панель лишь видимый диапазон
свеч, т.е. если сдвинуть график в сторону, я с каждой новой свечой рассчитаю новый
диапазон видимых свеч, очищаю Canvas.Children и данный список выведу на график, добавив
в Canvas.Children. При таком варианте я могу спокойно настраивать масштаб, при новом
расчете я нахожу максимум и минимум свеч и заношу рассчитываю высоту относительно этого.
Но данный способ слишком долгий для расчетов. И в итоге логичнее уже на графике хранить
сразу все свечи. Но вот проблема заключается тогда в видимом диапазоне. Т.е. надо в
массиве Canvas.Childern найти нужные свечи и поменять их значения Y и X, значения длины
прямоугольников и линий, которые идут вверх и вниз от них. Но будет ли это лаконичным?
На сайтах это всё происходит мгновенно, как ни крути. Может кто подсказать пожалуйста,
как лучше реализовать это? 2 картинки, с любого сайта и моей программы.


    


Ответы

Ответ 1



Смотрите, как можно сделать это с помощью трансформаций. Я буду выводить коллекцию прямоугольников, для вывода буду использовать ItemsControl, у которого в качестве ItemsPanel будет установлен Canvas. ItemsControl я оберну в Border, чтобы просто обозначить границы графика, ну и потом он еще сыграет свою небольшую роль. Также я размещу 2 кнопки для сдвига "окна" просмотра графика:

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

#sql #postgresql


Для оценки производительности моего приложения нужно наполнить БД большим количеством
тестовых данных. Встала задача заполнить имеющуюся таблицу автоматически сгенерированными
данными. Думал сделать это с помощью одного или нескольких SQL-запросов. Однако столкнулся
с затруднением с циклами — кажется, они не дают возможности генерирования произвольных
последовательностей. Может быть, есть вариант построить временную таблицу с бесконечным
количеством строк, вызывав какую-нибудь встроенную функцию?

К примеру, можно вопрос конкретизировать: как автоматически заполнить таблицу нижеследующими
данными?

|col1|col2|col3|col4|
|----|----|----|----|
|   0|   1|   0|    |
|   1|   2|   1|    |
|   2|   3|   0|    |
|   4|   4|   1|    |
|   8|   5|   0|    |
|  16|   6|   1|    |
    .   .   .   .
| 2^N| N+1| N%2|  * |


* любая формула по-вашему усмотрению
    


Ответы

Ответ 1



Пока составлял вопрос — нашёл решение :) INSERT INTO t(col1, col2, col3) SELECT 2 ^ k, k + 1, k % 2 FROM generate_series(0, N) AS k https://postgrespro.ru/docs/postgrespro/10/functions-srf

Параметры функции VueJS

#javascript #vuejs


Подскажите, есть такая функция которая вызывается в VueJS следующим образом 
событие myEvent возвращает результат (result) при вызове:




метод:

myFunction(arg){
    console.log(arguments) //result
}


как нибудь можно в myFunction передать дополнительные параметры примерно так:


    myFunction(){
    console.log(arguments) //arg ----- как здесь получить result?
}

    


Ответы

Ответ 1



В inline-обработчиках доступен объект $event. Его можно передать в функцию вместе с дополнительными параметрами: ... method(event, parameter) { console.log(event); console.log(parameter); } Сниппет: new Vue({ el: '#app', methods: { method(event, parameter) { console.log(event.target); console.log(parameter); } } })


Как сделать блок ссылкой?

#javascript #html #jquery #ссылки


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


Ответы

Ответ 1



.outer{ position:relative; background: green; height: 200px; } .direct-link { position:relative; z-index:2; background: red; } .all-block-link { position:absolute; z-index:1; width:100%; height:100%; left:0; top:0; }
Попробуй сделать следующее

Ответ 2



попробуйте так: $("#block").click(function(){ location.href="нужный url" }); $("#block a").click(function(e){e.stopPropagation()});

Как можно добиться эффекта плавного перехода между фоном и объектом в Unity?

#c_sharp #unity3d


Не знаю как это называется правильно Gradient Fade-In или как-то по-другому , поэтому
к примеру прикрепил изображения что я хочу получить 





UPD:
@test123 Ваш шейдер странно себя ведет, меняет цвет моей платформи и не работает
этот переход как нужно

Мой объект


Ваш шейдер


UPD 2:
Это то что нужно получить на финале 

    


Ответы

Ответ 1



Попытаюсь показать, как бы это сделал на шейдерах я: Нам необходимо ввести текстуру и цвет, чтобы вы полноценно смогли работать с материалом объекта в дальнейшем. Объекты могут быть разными по высоте, значит нам надо ввести какой то коэффициент для каждого объекта, описывающий его высоту. Введём коэффициент прозрачности, который будет показывать с какой скоростью исчезает объект с места перехода. Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,1)) = 1 _Height("Height", Range(0,100)) = 1 } Далее, указываем что нас интерисует альфа как объекта, так и текстуры: Tags {"Queue"="Transparent" "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha Теперь объявляем с чем мы имеем дело (vert и frag функции): #pragma vertex vert #pragma fragment frag Далее, простейшие операции: struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _Height; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _TintColor; return col; } Создаю сцену, и делаю материалы Теперь, так как у вертексов нет понятия "Bounds", то есть, мы не можем узнать, размеры меша (расстояние между двумя самыми дальними вершинами) по необходимой плоскости, мы воспользуемся пунктом 2, и проследим за нашей переменной, немного модефицируя шейдер: fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _TintColor; if(i.vertex.y<_Height){ col = fixed4(1,0,0,1); } return col; } На моём примере видна граница, которая нас интересует - эта граница будет показывать, откуда нам начинать прятать объект: Делаем очередную модификацию кода: fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _TintColor; if(i.vertex.y<_Height){ float y = i.vertex.y; col.a = 1-_Transparency*(_Height-y); } return col; } Чтобы менять альфу относительно текущей высоты точки на экране, и подкручиваем параметр прозрачности _Transparency: В итоге, я получил результат для материала группы одинаковых объектов: Полный листинг шейдера можно посмотреть тут Вот готовый вариант по uv: Shader "Custom/Test" { Properties { _MainTex ("Texture", 2D) = "white" { } _Height ("Height", float) = 0 _Transparent ("Transparent", Range(0,2)) = 0 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _Height; float _Transparent; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); float y = i.uv.y; if(y<_Height){ col.a = 1-_Transparent*(_Height-y); } return col; } ENDCG } } }

Тернарный оператор вместо конструкции if-else

#java #if


Можно ли улучшить(упростить) данную конструкцию тернарным оператором?

if (isLeftLetter && isRightLetter) {
    swap(chars, leftElementIndex, rightElementIndex);
    leftElementIndex++;
    rightElementIndex--;

} else {         
    if (!isLeftLetter) {
        leftElementIndex++;
    }

    if (!isRightLetter) {
        rightElementIndex--;
    }
}

    


Ответы

Ответ 1



Я бы написал так: if (isLeftLetter && isRightLetter) { swap(chars, leftElementIndex, rightElementIndex); leftElementIndex++; rightElementIndex--; } else { leftElementIndex=(!isLeftLetter) ? leftElementIndex+1 : leftElementIdex; rightElementIndex=(!isRightLetter) ? rightElementIndex+1 : rightElementIdex; } Update Тернарный оператор удобно использовать для однострочных присвоений, а ля: var=(condition) ? expression1 : expression2; в остальных вариантах, я лично не рекомендую (верю, что некоторые не согласятся)

Ответ 2



(isLeftLetter && isRightLetter) ? (swap(chars, leftElementIndex, rightElementIndex), leftElementIndex++, rightElementIndex--) : ( (!isLeftLetter) ? leftElementIndex++ : leftElementIndex, (!isRightLetter) ? rightElementIndex-- : rightElementIndex ); Все же нежелательно использовать данную конструкцию. Как видите читаемость стала лишь сложнее. Но если это Ваш личный проект и Вы сами его поймете, то дело Ваше.

Как назначить цену приложению в Google Play Console?

#android #android_studio #google_play_console


Как назначить цену приложению в Google Play Console?
    


Ответы

Ответ 1



При заливке приложения не забыть сразу указать, что оно Платное. Иначе Бесплатное потом невозможно будет перевести в Платное - так задумано! ) Зайти в Настройки своего акаунта Зайти в Шаблоны цен Создать Новый шаблон цен Вернуться в приложение. Зайти в Настройки страницы приложения > Цены и Распространение и назначить нужный шаблон своему приложению Рис. к пункту 2: Рис. к пунктам 3,4:

Signed Int32 из двух байт

#java #c_sharp #битовые_операции


Есть строка из Java приложения, которая формирует signed INT из двух байт массива:

final int size = array[0] & 0x00FF | array[1] << 8;


где, array[0] равно 0x08, array[1] равно 0xEE. Этот код формирует число -4600.

Но C# формирует совсем иное число из аналогичного кода:

int size = array[0] & 0x00FF | array[1] << 8;


Но этот код формирует число 60936.

Подскажите, в чём соль между этими языками и как решить такую проблему.
    


Ответы

Ответ 1



В этой строке final int size = array[0] & 0x00FF | array[1] << 8; значение выражения записывается в int (4 байта). Это значит, что все операнды преобразовываются в четырехбайтовые значения. Расширение разрядности в Java происходит путем копирования старшего бита в исходном числе на расширяемые биты. Итого у Вас было final int size = 0x08 & 0x00FF | 0xEE << 8; или в двоичном виде final int size = 0000_1000b & 0000_0000_0000_0000_0000_0000_1111_1111b | 1110_1110b << 8; теперь, что получается при расширении final int size = 0000_0000_0000_0000_0000_0000_0000_1000b & 0000_0000_0000_0000_0000_0000_1111_1111b | 1111_1111_1111_1111_1111_1111_1110_1110b << 8; В c# такого копирования старшего бита не происходит. (скорее всего там приводится к типу не операнды, а итоговый результат) Если Вы хотите на Java избежать такого расширения, то применяйте к каждой байтовой переменной операцию побитового И с 0xFF final int size = array[0] & 0xFF | (array[1] & 0xFF) << 8; тогда при расширении получится final int size = 0000_0000_0000_0000_0000_0000_0000_1000b & 0000_0000_0000_0000_0000_0000_1111_1111b | ( 1111_1111_1111_1111_1111_1111_1110_1110b & 0000_0000_0000_0000_0000_0000_1111_1111b ) << 8; final int size = 0000_0000_0000_0000_0000_0000_0000_1000b | 0000_0000_0000_0000_0000_0000_1110_1110b << 8;

Правильный тип для String int double boolean

#java #sql #база_данных #spring_boot #spring_jpa


Задача стоит в проектировании БД для интернет магазина. 

У каждого товара есть набор характеристик (связь многие ко многим разбивается через
промежуточную табличку).
У сущности "характеристика" есть кроме id еще String name и ??? value

Вопрос в том, какой лучше тип выбрать для value ?? пока склоняюсь к типу String,
в который можно писать все вышеперечисленные типы.
Еще есть мысли по поводу не заморачиваться и написать туда Object или Serializible. 

С точки зрения проектирования какое решение будет правильнее?

Spring Boot (Spring JPA)
    


Ответы

Ответ 1



Еще есть мысли по поводу не заморачиваться и написать туда Object или Serializible. А заморочиться придется... Это ровно та задача, которая стоит перед любым разработчиком универсальной структуры данных. Путь известен и проторен не одним десятком прогеров, включая и меня самого. Основные положения: Типизация (без него никуда), с основными типами: целое, с плавающей точкой, булевая, дата, строка. Ну может еще что-то. Реализация типа на уровне класса Если подробнее то примерно так (простейшая реализация для двух типов строка и целое число): abstract class MyType { abstract void setValue(int value); abstract void setValue(String value); abstract String getValue(); } class MyTypeString extends MyType { private String valueString=null; @Override void setValue(int value) { valueString=new StringBuilder().append(value).toString(); } @Override void setValue(String value) { valueString=value; } @Override String getValue() { return value; } } class MyTypeInt extends MyType { private Integer valueInt=null; @Override void setValue(int value) { valueInt=value; } @Override void setValue(String value) { try { int val=Integer.parseInt(value); valueInt=new Integer(val); } catch(Exception ex) { valueInt=null; } } @Override String getValue() { return new StringBuilder().append(valueInt).toString(); } }

Ответ 2



Выбрать "правильнее" не получится, зависит от реализации и необходимых задач. Как вариант, добавить таблицу справочник характеристик, в которой хранить название характеристики и её тип (например Ватт, число), а в самой характеристике хранить переменную с типом Object. В таком случае, когда нам необходимо добавить значение на экран, можно просто воспользоваться .toString(), когда нам необходимо сделать фильтрацию (например, показать для товара ползунок с максимальным и минимальным значением (блок питания 300-1000 Ватт)) используем справочник характеристик и конвертируем значение в нужный формат.

Ответ 3



Я сталкивался с 2 вариантами реализации подобных задач. В обоих случаях требуется завести справочник характеристик с информацией о типе значения (число, строка, дата и пр.). Вариант 1 Для каждого типа значений создать отдельную таблицу number_values(товар, характеристика, значение-число), string_values(товар, характеристика, значение-строка) и т.д. Плюсы: Контроль данных на уровне БД (например, для числовой характеристики в number_values не получится записать строку и пр. мусор). Расширяемость - при добавлении нового типа данных не требуется изменять существующие сущности (нужно только создать таблицу для значений нового типа и добавить условие в общий SQL-запрос (см. далее)). Минусы: Сложный общий SQL-запрос для выборки значений характеристик - нужно делать join-ы с определенной таблицей со значениями в зависимости от типа характеристики. Усложнение логики вставки/обновления/удаления значения характеристики - таблица также определяется в зависимости от типа характеристики (НО, учитывая, что структура таблиц со значениями одинакова, отличается только тип значения, то можно легко написать общий код). Нужно самостоятельно контролировать консистентность данных на предмет того, чтобы, например, по одной и той же характеристике одного товара не было записей в нескольких таблице значений разных типов. Вариант 2 - использовать одну разряженную таблицу values(товар, характеристика, значение-число, значение-строка, значение-дата, ...), где заполнено только одно из значений. Плюсы: Значения атрибутов выбираются из одной таблицы -> простой SQL-запрос Для каждого товара не более одного значения любой характеристики Минусы: Сложность в расширении - необходимо модифицировать общую таблицу со значениями Хранение в одной большой таблице при большом объеме данных станет узким местом В обоих случаях я бы советовал вам в результатах выборки запроса возвращать типизированные значения, а уже на уровне бизнес-логики проводить определенные манипуляции.

как замерить время выполнения функции Android Studio?

#android #android_studio


есть ряд процедур как выявить самую долгую? 

сейчас делаю так

 long p0 = System.currentTimeMillis(), p1,p2,p3;
 proc1();
 pt1 = System.currentTimeMillis()-p0;
 proc2();
 pt2 = System.currentTimeMillis()-p0-p1;
 proc3();
 pt3 = System.currentTimeMillis()-p0-p1-p2;


в Android Studio может есть встроенный функционал?
    


Ответы

Ответ 1



Попробуйте с помощью TimingLogger TimingLogger timings = new TimingLogger(TAG, "methodA"); // ... do some work A ... timings.addSplit("work A"); // ... do some work B ... timings.addSplit("work B"); // ... do some work C ... timings.addSplit("work C"); timings.dumpToLog(); На выходе D/TAG ( 3459): methodA: begin D/TAG ( 3459): methodA: 9 ms, work A D/TAG ( 3459): methodA: 1 ms, work B D/TAG ( 3459): methodA: 6 ms, work C D/TAG ( 3459): methodA: end, 16 ms

Не меняется курсор в FireFox

#css #firefox


По событию mousedown создаётся под указателем новый элемент со своим набором стилей,
в том числе собственный вид курсора.



$(document).ready(function() {
  $("input").on("mousedown", function() {
    $("body").append("
") }); $(document).on("mouseup", function() { $("div.resizable").remove(); }); }); .resizable { width: 100px; height: 100px; position: absolute; top: 5px; left: 5px; cursor: move; background: #eee; } В Chrome и IE всё работает как надо, а вот Firefox вредничает: курсор остаётся тем же, что был до mousedown.


Ответы

Ответ 1



Судя по всему, FF показывает курсор input'а до тех пор, пока нажата кнопка. Можно попробовать исправить так (но код с mouseup кривой - надеюсь, он тут для примера): $(document).ready(function() { $("input").on("mousedown", function() { $(this).addClass("move-cursor") $("body").append("
") }); $(document).on("mouseup", function() { $(this).removeClass("move-cursor") $("div.resizable").remove(); }); }); .resizable { width: 100px; height: 100px; position: absolute; top: 5px; left: 5px; cursor: move; background: #eee; } .move-cursor { cursor: move; }

Префикс не связан c пространством имён SVG

#html #css #svg


Хочу сделать текст дугой.
Как видно в данном примере тут все отображается, а вот если в браузере открыть, то
получаю вот такую ошибку и в Opera Chrome, FF





А вот в EDGE && IE просто пустота без всяких ошибок.
Не смотря на ошибку, я вопрос в любом случае хотел написать, так как хотел спросить
помощи в разъяснении  логики построение координат атрибута d элемента path, но тут
получается два вопроса в одном...



Коллеги, вопрос, что эта за ошибка у меня и как ее исправить, с утра не могу справиться
с ней?



И может кто разъяснить  хотя бы приблизительно какая координата атрибута d элемента
path за что отвечает?





    
        
    
    
    
        
            Lorem ipsum dolor sit amet consectetur.
        
    




    


Ответы

Ответ 1



#1. Немного уточню вопрос. Сообщение об ошибке появляется при открытии файла с расширением *.svg Если точно такой же код SVG сохранить с расширением *.html то сообщения об ошибке не будет. В современных браузерах html парсер, если есть ошибки в svg коде пропускает их и выполняет код дальше. В вашем коде не указано пространство имен XML. Парсер svg считает это ошибкой и останавливает выполнение файла. Необходимо добавить в шапку svg файла строчки определяющие namespace xml: xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" и тогда ваш код будет работать в любом окружении. Lorem ipsum dolor sit amet consectetur. Отсюда вытекает практический совет,- делать отладку svg кода в его родном окружении, то есть в файле с расширением *.svg и только потом добавлять код в html страничку. #2. И может кто разъяснить хотя бы приблизительно какая координата атрибута d элемента path за что отвечает? d="M0.057,0.024c0,0,10.99,51.603,102.248,51.603c91.259,0,136.172,53.992,136.172,53.992" /> M (moveto) - переместить перо в точку с координатами (X,Y) 0.057,0.024 c с этого символа начинается формула кубической кривой Безье – The cubic Bezier curve

Ответ 2



Примеры анимации текста Этот вид анимации текста пока не выполняется с помощью правил анимаций CSS Для реализации анимации текста вдоль кривой направляющей достаточно к примеру автора вопроса добавить одну строку: 1. Ниже полный код: Lorem ipsum dolor sit amet consectetur. 2. Более сложный пример анимации текста, вокруг многоугольника: Весь очень длинный текст целиком вокруг шестиугольника Старт

Как перемещать приложение, если шапка с кнопками управления окна (закрыть/свернуть/расширить) скрыта

#python #python_3x #pyqt5


Как скрыть верхнюю шапку где находятся кнопки управления приложения
(закрыть/свернуть/расширить), но в тоже время можно было бы перемещать приложение. 

Как саму шапку скрыть я понял, но как сделать чтобы можно было бы при этом перемещать
приложение 

import sys
from PyQt5 import QtWidgets, QtCore

app = QtWidgets.QApplication(sys.argv)

w = QtWidgets.QMainWindow()
w.setWindowFlags(QtCore.Qt.FramelessWindowHint)
w.show()
sys.exit(app.exec_())

    


Ответы

Ответ 1



Пример: from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtCore import Qt class Widget(QWidget): def __init__(self): super().__init__() self.setWindowFlags(Qt.FramelessWindowHint) self.old_pos = None def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.old_pos = event.pos() def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.old_pos = None def mouseMoveEvent(self, event): if not self.old_pos: return delta = event.pos() - self.old_pos self.move(self.pos() + delta) if __name__ == '__main__': app = QApplication([]) w = Widget() w.show() app.exec()

Ответ 2



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

Равенство 4 текстовых значений

#javascript


Почему 1 == 1 == 1 == 1 выдает результат true, а
'knx' == 'knx' == 'knx' == 'knx' выдает результат false
    


Ответы

Ответ 1



потому что 1 это ещё и true. попробуйте так 2 == 2 == 2 == 2 - будет false работает примерно так: (1 == 1) == 1 == 1 итого (true) == 1 == 1 далее ((true) == 1 ) == 1 - тоже true (так как 1 это true). Ну и так далее... 'knx' == 'knx' == 'knx' == 'knx' : 'knx' == 'knx' == 'knx' == 'knx' -> (true) == 'knx' == 'knx' -> (true == 'knx') - false

Ответ 2



Потому что это логично. 1 - истина (true), 0 - ложь (false). Результат первой операции сравнения будет логическим типом и равняется true, далее true ты сравниваешь с 'knx'. А теперь подумай над этим - 'knx' == true.

Ответ 3



Потому что сравнение выполняется слева направо: ((1 == 1) == 1) == 1 (true == 1) == 1 true == 1 true Правильно сравнивать одним из следующих способов: var a = 2, b = 2, c = 2, d = 2; console.log(a == b && a == c && a == d); console.log(a === b && a === c && a === d);

StackExchange.Redis: несколько вопросов по транзакциям

#c_sharp #net #redis


Возникло несколько вопросов по работе транзакций в StackExchange.Redis:


Можно ли помещать в одну транзакцию команды, предназначенные для разных нод в кластере?
Например, у ключа первой команды хэштэг {1}, а у ключа второй команды -- {2}. (Подозреваю,
что нельзя.)
В каких случаях вызов Execute()/ExecuteAsync() возвращает false? Только когда установленные
условия не были выполнены? Может ли вызов вернуть false, если условия вообще не были
установлены?
Eсли происходит ошибка сети или внутренняя ошибка Redis, то вызов Execute()/ExecuteAsync()
выбросит исключение или вернет false? Нужно ли еще проверять таски всех команд (предполагается,
что все команды корректные и не должны выбрасывать ошибок) или они просто будут в состоянии
cancelled?


К сожалению, документация насчет #2 и #3 не слишком подробная.



Этот вопрос -- дубликат с enSO.
    


Ответы

Ответ 1



Я заглянул в исходники StackExchange.Redis, а также поигрался с драйвером, и вот что обнаружил: при вызове методов команд у ITransaction никакого общения с сервером не происходит драйвер обращается к Redis только после вызова Execute()/ExecuteAsync() Поэтому ответы следующие: Как подсказали в оригинальном вопросе на enSO, в случае кластера все multi-key команды должны соответствовать одному слоту. В контексте кластера транзакция считается multi-key командой. Redis Cluster implements all the single key commands available in the non-distributed version of Redis. Commands performing complex multi-key operations like Set type unions or intersections are implemented as well as long as the keys all belong to the same node. https://redis.io/topics/cluster-spec При попытке выполнить транзакцию с невалидными ключами получим исключение "Multi-key operations must involve a single slot". Execute()/ExecuteAsync() возвращает false в двух случаях: когда условия транзакции не были выполнены и транзакция была отменена, и когда драйвер не смог поставить команду в очередь (например, если на сервере кончилась память). Все таски при этом помечаются как canceled. Также Execute()/ExecuteAsync() не возвращает false если некоторые команды завершились неудачно (например, если команда была адресована ключу с неправильным типом значения). В случае проблем с сетью, Execute()/ExecuteAsync() выбрасывает исключение, а все таски остаются в состоянии waiting for activation. Итого, таски следует проверять только когда Execute()/ExecuteAsync() возвращает true: каждый таск будет содержать или результат команды, или ошибку (см. свойство Exception).

Удаление из строки служебных частей речи(союзы, предлоги частицы, междометия и др.) Python 3

#python #python_3x #строки #обработка #морфология


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

Пример:
Строка до применения: "Однако я так и не смог закончить"
Строка после применения: "я не смог закончить"
    


Ответы

Ответ 1



Если вы хотите удалить избранные части речи из строки, то можно части речи определить [к примеру] используя pymorphy2: import pymorphy2 # $ pip install pymorphy2 def pos(word, morth=pymorphy2.MorphAnalyzer()): "Return a likely part of speech for the *word*.""" return morth.parse(word)[0].tag.POS words = "Однако я так и не смог закончить".split() functors_pos = {'INTJ', 'PRCL', 'CONJ', 'PREP'} # function words print(*[word for word in words if pos(word) not in functors_pos]) # -> я смог закончить Часть речи по одному только слову может быть неверно определена. В частном случае, вы можете просто свой набор слов для удаления поддерживать. Можно разобрать части речи, используя averaged_perceptron_tagger_ru из nltk: import nltk # $ pip install nltk # nltk.download('averaged_perceptron_tagger_ru') words = nltk.word_tokenize("Однако я так и не смог закончить") functors_pos = {'CONJ', 'ADV-PRO', 'CONJ', 'PART'} # function words print(*[word for word, pos in nltk.pos_tag(words, lang='rus') if pos not in functors_pos]) # -> я смог закончить

Как превратить EditText в поток данных для RxJava2?

#android #rxjava #listener #rxandroid #rxjava2


Начал постепенно переходить на реактивное программирование с замечательным фреймворком
RxJava 2 и заинтересовал простейший пример создания потока в динамическом стиле. К
сожалению, не считаю пример Observable.just(1,2,3) достаточно полным для себя, но вот
уже несколько часов мучаю себя мыслью, как превратить изменения в EditText в поток
данных? Если не сложно, опишите, пожалуйста, пример как сделать реальный Observable
из TextWatcher, чтобы можно было на него подписаться и подписчик реагировал на изменения
текста в EditText. 
    


Ответы

Ответ 1



Можно воспользоваться готовой библиотекой RxBinding. Также в ней можно посмотреть конкретную реализацию. Вообще для связки callback-методов с rx используется метод Observable.create, например: Observable.create(emitter -> { TextWatcher watcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { if (!emitter.isDisposed()) { //если еще не отписались emitter.onNext(editable.toString()); //отправляем текущее состояние } } }; emitter.setCancellable(() -> editText.removeTextChangedListener(watcher)); //удаляем листенер при отписке от observable editText.addTextChangedListener(watcher); }); Нужно не забыть подписаться, и самое главное, отписаться от такого источника данных, т.к. он держит ссылку на editText и может привести к утечке памяти.

Нахождение площади четырехугольников по координатам

#c #координаты


На плоскости задано n точек с координатами x[n], y[n]. Нужно найти четверки точек,
составляющие четырехугольник наибольшей площади. 

Я написал такой код, который проверяет все возможные комбинации точек, считает площадь
по формуле Гаусса и находит максимальную площадь. Естественно, точек должно быть не
меньше 4. 

for (i = 0; i < n - 3; i++)
            for (j = 1; j < n - 2; j++)
                for (k = 2; k < n - 1; k++)
                    for (l = 3; l < n; l++)
                    {
                        s = fabs(((x[i] * y[j] - y[i] * x[j]) + (x[j] * y[k] - y[j]
* x[k]) + (x[k] * y[l] - y[k] * x[l]) + (x[l] * y[i] - y[l] * x[i])) / 2.0);
                        if (s > max) max = s;
                    }


И всё бы хорошо, но площадь упорно равна нулю. Подскажите, что я делаю не так. Может
проблема в последовательности ввода координат точек? Есть ли другой способ вычисления
площади по координатам?
    


Ответы

Ответ 1



Площадь по данным четырем точкам у вас вычисляется правильно. Если уж вы взялись решать задачу полным перебором, то вам нужно перебирать все возможные комбинации из четырех различных точек во всех относительных порядках. То есть в самом "брутальном" варианте циклы должны выглядеть примерно так for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (j != i) for (k = 0; k < n; k++) if (k != i && k != j) for (l = 0; l < n; l++) if (l != i && l != j && l != k) /* Проверяем площадь */; У вас же наблюдается какое-то странное неоправданное исключение некоторых вариантов, но при этом нет никакой защиты от того, что одна и та же точка может быть взята несколько раз. Например, в вашем наборе ( i, j, k, l ) точка 0 может быть только первой, а точка n-1 - только последней. То есть вариант ( 0, j, n-1, l ) вы никогда не рассмотрите. На каком основании вы исключили такие четырехугольники из рассмотрения? Из этого перебора, в целях оптимизации, имеет смысл исключить циклические сдвиги одного и того же набора, ибо они описывают один и тот же многоугольник. По той же причине также имеет смысл исключить зеркальные обращения одного и того же набора. Но не более того. Для исключения из рассмотрения циклических сдвигов достаточно обеспечить, чтобы каждый рассматриваемый набор начинался со своего минимального элемента. Для исключения из рассмотрения зеркальных отражений достаточно обеспечить, чтобы в перестановке (j, k, l) содержалось не более одной инверсии for (i = 0; i < n - 3; i++) for (j = i + 1; j < n; j++) for (k = i + 1; k < n; k++) if (k != j) for (l = i + 1; l < n; l++) if (l != j && l != k) if ((j > k) + (k > l) + (j > l) <= 1) /* Проверяем площадь */; Например, на наборе из 5 точек такой перебор проверит только 15 вариантов, в то время как полный перебор проверит 5! = 120 вариантов. На наборе из 6 точек - 45 вместо 720. Однако эта задача имеет и эффективное решение. Оно начинается из построения выпуклой оболочки для вашего набора точек. Если выпуклая оболочка имеет четыре или более вершин, то точки, не лежащие на выпуклой оболочке исключаются из дальнейшего рассмотрения. А дальше несложный "поворотный" алгоритм найдет четырехугольник максимальной площади без полного перебора. Если же выпуклая оболочка является треугольником, то надо лишь найти дополнительную внутреннюю точку, "выкусывающую" минимальную площадь из этого треугольника.

Как наложить текст на картинку в html?

#html #текст #img






   
    	Наука.ру - главная
    
    
        
        
    	

Космоинфо

Погрузись в космос вместе с нами!

Новости    Вопросы
  Основная

надо, чтобы и отображались прямо на картинке, а не под ней.


Ответы

Ответ 1



Наука.ру - главная

Космоинфо

Погрузись в космос вместе с нами!

Новости    Вопросы
  Основная



Ответ 2



Попробуй задать как фоновое изображение через CSS/SASS. В .sass: .image{ background: url('image/image1.png'); width: 320px; height: 280px; //размер условный } В HTML-документе:

Текст Текст Текст



Ответ 3



Вариант 1, с использованием position: absolute .container { position: relative; } .container img { position: absolute; } .container p{ color: #fff; position: relative; }

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Itaque, nulla?

Вариант 2, с использованием background-image (нужно знать размеры блока) .bg { background: url('https://d626yq9e83zk1.cloudfront.net/files/2017/12/26-770x425.jpg') center center no-repeat; width: 300px; height: 300px; } .bg span { color: #fff; }
Lorem ipsum dolor sit amet consectetur adipisicing elit. Assumenda, rerum.


Пустой список компонентов Windows 10, как исправить баг?

#windows #windows_10


Вот, что вижу, когда открываю компоненты:



Как быть?
    


Ответы

Ответ 1



Хм... Проблема была замечена ещё в Windows Vista. До сих пор не исправили? Ладно, итак: Заходим в управление службами (можно через Пуск, я предпочитаю Win+R, ввести "services.msc"), ищем там службу "Установщик Windows" (Windows Installer в английской версии). Переводим режим запуска в Автоматический, сохраняем настройки, перезапускаем систему. Если не помогло, запускаем проверку и восстановление системных файлов: sfc /SCANNOW Лучше всего это сделать в Safe Mode, для этого: запускаем msconfig (Win+R, ввести "msconfig"), переходим на вкладку "Загрузка", выбираем безопасный режим: Не забываем затем вернуть всё взад, иначе так и будете загружаться в безопасном режиме :) Если не помогло и это, запускаем "мой любимый" DISM: Dism.exe /Online /Cleanup-Image /Restorehealth Учтите, ждать придётся долго, лучше не прерывать задачи и озаботиться тем, чтобы компьютер был обеспечен бесперебойником. Если ничего не помогло, требуется восстановление или переустановка системы.

Как сделать вечную привязку (snap) в Inkscape?

#svg #inkscape




концы линии привязаны к центрам кругов. Как делать так, чтобы при смещении кругов
смещалась и соединяющая их центры линия?

UPD (после первого ответа). Круги смещаются по отдельности: один круг смещается,
и конец линии, привязанный к нему, смещается вместе с ним. Другой конец линии вместе
с другим кругом остаётся на месте.
    


Ответы

Ответ 1



В Inkscape с версии 0.91 или 0.92 есть инструмент для рисования соединительных линий (Ctrl+F2). Попробуйте с его помощью, правда, соединятся не центры окружностей, а их края. Но есть трюк: в центре каждой окружности сделайте очень маленькую окружность такого же цвета или с прозрачной заливкой. Соедините маленькие окружности соединительной линией. Сгруппируйте попарно маленькие окружности с большими. Теперь, визуально, линия соединяет центры окружностей и движется вместе с каждой из них.

Ответ 2



Для этого надо объединить два круга и линию в одну группу Рисуете в редакторе два круга, заполняете из цветом, далее рисуете линию соединяющую центры кругов. Далее нажав SHIFT делаете выделение всех объектов и объединяете их в группу нажав на иконку (показана красной стрелкой) или просто нажимаете CTRL+G Всё объекты одно целое и их можно перемещать по холсту, как одно целое. Ниже код svg этих фигур

Разное поведение constexpr на разных платформах

#cpp #cpp14 #constexpr


Доброго времени суток. Есть класс, который включает в себя другой класс со статическими
членами массивами. Я очень хочу сделать что бы у меня была возможность задать все статик
значения этих членов в хедере а не в cpp части. Для этого я применил constexpr и эта
схема нормально заработала на компиляторе от Microsoft. Однако на g++ под ARM на Debian
этот код не компилируется:


  undefined reference to `Foo::Target::IP'


В обоих случаях используется С++14. Вопрос вот в чём. Почему один компилятор это
принимает, а другой нет, т.е. в чём отличия работы с constexpr внутри у этих компиляторов?
Это никак не стандартизовано? Что мне сделать, чтобы такая схема заработала?

class Foo {
public:
    static void GetIp(uint8_t* data) {
        memcpy(data, &Target::IP[0], 4);
    };
private:
    class Target {
    public:
        static constexpr uint8_t IP[4] = { 192,168,0,110 };
        static constexpr uint16_t Port = 3000;
    };
};
int main()
{
    uint8_t A[4];
    Foo::GetIp(A);
    printf("%u.%u.%u.%u", A[0], A[1], A[2], A[3]);
    system("PAUSE");
    return 0;
}

    


Ответы

Ответ 1



Да чтоб заработало, все просто - добавить constexpr uint8_t Foo::Target::IP[4]; Только и всего. См. https://ideone.com/ZMqPMn Но вот что именно строго по стандарту, а что нет - тут я не скажу, не уверен. Понятно, что целочисленное поле и массив - разные вещи, но что именно стандарт разрешает, что нет, и что отдает на откуп реализации - не скажу...

изменить тип поля VARCHAR на DATE

#mysql #дата


Два года назад была создана база, сейчас хочется ее немного привести в порядок.

Было неправильно выбрано (по неопытности) хранение даты в обычном varchar, запись
идет туда в виде числа UNIXTIME.

Хочу изменить тип поля VARCHAR на DATE.

Можно ли сделать это быстро через сам mysql запрос в phpMyAdmin?
Или придётся писать функцию, выбирать каждое поле, преобразовывать unix в YYYY-MM-DD,
и записывать его обратно? А после этого уже менять тип?

Число строк около 3000.
    


Ответы

Ответ 1



Самый быстрый способ такой Создаете новый столбец типа TIMESTAMP/DATETIME Выполняете запрос UPDATE mytable SET new_col = FROM_UNIXTIME(old_col); Удаляете старый столбец Переименовываете новый столбец в старое имя

Прокрутка ScrollBar'a по одному элементу ItemsControl'a

#c_sharp #wpf


Имеется ScrollViewer, внутри которого лежит ItemsControl:


        
            
                
                    
                
            
        
    


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

Появилась область внизу списка(


    


Ответы

Ответ 1



Ваш ItemsControl лежит внутри ScrollViewer и выглядит для него как одно целое, для того, чтобы ScrollViewer мог различать отдельные элементы внутри ItemsControl, он должен сам лежать внутри него. Это можно сделать, изменив шаблон: Обратите внимание, на свойство CanContentScroll="True" - именно оно заставляет ScrollViewer скролить содержимое "поштучно". Кстати, например, ListBox уже имеет в своем шаблоне ScrollViewer, поэтому ему править шаблон не придется, достаточно будет установить свойство ScrollViewer.CanContentScroll="True" Количество элементов, которое прокручивается колесиком мыши зависит от настроек системы: Чтобы сделать поштучную прокрутку колесиком мыши, можно воспользоваться этим ответом: private void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e) { var scrollViewer = (ScrollViewer)sender; int p = e.Delta > 0 ? 1 : -1; scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - p); e.Handled = true; }

Алгоритм поиска часто встречающейся записи в списке

#python #python_3x


Есть список:

['a, b, c', 'b, c, a', 'c, a, b', 'a, b, c', 'a, b, c', 'b, a, c']


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

Помогите с алгоритмом, пожалуйста.
    


Ответы

Ответ 1



Воспользуйтесь collections.Counter: In [146]: from collections import Counter In [147]: l = ['a, b, c', 'b, c, a', 'c, a, b', 'a, b, c', 'a, b, c', 'b, a, c'] In [148]: c = Counter(l) In [149]: c Out[149]: Counter({'a, b, c': 3, 'b, a, c': 1, 'b, c, a': 1, 'c, a, b': 1}) чаще всего встречающийся элемент: In [150]: c.most_common(1)[0] Out[150]: ('a, b, c', 3) реже всего встречающийся элемент: In [151]: c.most_common()[-1] Out[151]: ('b, a, c', 1) можно легко реализовать нечто похожее самому воспользовавшись словарем: In [175]: d = {x:l.count(x) for x in l} In [176]: d Out[176]: {'a, b, c': 3, 'b, a, c': 1, 'b, c, a': 1, 'c, a, b': 1} In [177]: max(d, key=d.get) Out[177]: 'a, b, c' In [178]: d[max(d, key=d.get)] Out[178]: 3 In [179]: min(d, key=d.get) Out[179]: 'b, c, a' In [180]: d[min(d, key=d.get)] Out[180]: 1 вот и вот более быстрые способы посчитать число вхождений: In [193]: d = {} In [194]: _ = [d.__setitem__(x,1+d.get(x,0)) for x in l] In [195]: d Out[195]: {'a, b, c': 3, 'b, a, c': 1, 'b, c, a': 1, 'c, a, b': 1} In [196]: d = {} In [197]: for x in l: ...: d[x] = d.get(x, 0) + 1 ...: In [198]: d Out[198]: {'a, b, c': 3, 'b, a, c': 1, 'b, c, a': 1, 'c, a, b': 1}

UPDATE IF ELSE Mysql

#mysql #update #if #else


UPDATE personal_card SET

if bank_book >= price_tariff
    bank_book = bank_book - price_tariff, 
    bank_pay = bank_pay + price_tariff, 
    stop_date = DATE_ADD(CURDATE(),Interval 1 MONTH)
else
    pay_status = '0'

WHERE stop_date = CURDATE() 


Не могу разобраться в условиях IF ELSE, проверяем bank_book >= price_tariff, если
TRUE до выполняем условие, если нет, то изменяем pay_status = '0'. Понимаю что можно
сделать двумя разными запросами, но мне кажется что в одном, это правильнее.

Спасибо!
    


Ответы

Ответ 1



Дополнительная переменная заведена чтобы не выполнять проверку для всех полей, а только один раз на строку. Первый вариант: SET @MyVar = 1; UPDATE personal_card SET bank_book = IF(@MyVar := bank_book >= price_tariff, bank_book - price_tariff, bank_book), bank_pay = IF(@MyVar, bank_pay + price_tariff, bank_pay), stop_date = IF(@MyVar, DATE_ADD(CURDATE(),Interval 1 MONTH), stop_date), pay_status = IF(@MyVar, 1, 0) WHERE stop_date = CURDATE() Второй вариант: SET @MyVar = 1; UPDATE personal_card SET bank_book = (CASE WHEN @MyVar := bank_book >= price_tariff THEN bank_book - price_tariff ELSE bank_book END), bank_pay = (CASE WHEN @MyVar THEN bank_pay + price_tariff ELSE bank_pay END), stop_date = (CASE WHEN @MyVar THEN DATE_ADD(CURDATE(),Interval 1 MONTH), ELSE stop_date END), pay_status = (CASE WHEN @MyVar THEN 1 ELSE 0 END) WHERE stop_date = CURDATE(); Третий вариант: UPDATE personal_card SET bank_book = bank_book - price_tariff, bank_pay = bank_pay + price_tariff, stop_date = DATE_ADD(CURDATE(),Interval 1 MONTH), pay_status = 1 WHERE bank_book >= price_tariff AND stop_date = CURDATE(); UPDATE personal_card SET pay_status = 1 WHERE bank_book < price_tariff AND stop_date = CURDATE();

Ответ 2



UPDATE personal_card SET bank_book = IF(bank_book >= price_tariff, bank_book - price_tariff, bank_book), bank_pay = IF(bank_book >= price_tariff, bank_pay + price_tariff, bank_pay), stop_date = IF(bank_book >= price_tariff, DATE_ADD(CURDATE(),Interval 1 MONTH), stop_date), pay_status = IF(bank_book >= price_tariff, '0', '1') WHERE stop_date = CURDATE() Сделал так. На сколько это грамотно? Если будет более 1000 строк?

Подходят ли книги описывающие Питон 3.4 для изучения Питона (последняя версия 3.6) [дубликат]

#python #книги


        
             
                
                    
                        
                            На этот вопрос уже дан ответ здесь:
                            
                        
                    
                
                        
                            Книги и учебные ресурсы по Python
                                
                                    (1 ответ)
                                
                        
                                Закрыт 2 года назад.
            
                    
Добрый день. Сразу скажу, что я новичок в программировании. Первым языком решил выбрать
Python, так как хочу заниматься машинным обучением. Но возникла проблема с выбором
литературы. Сомневаюсь в корректности выбора обучающей литературы.  Как уже понял,
последняя версия Python - 3.6. Но учебники, которые я нашел, охватывают лишь 3.4. Стоил
ли остановиться на этих ресурсах или же искать более современные учебники? Есть опасения,
что в учебниках может быть представлена устаревшая информация и потом придется переучивать.
Возможно я рассуждаю неправильно, не судите строго, я только делаю первые шаги в программировании.
Прошу помощи в неравнодушных людей. Порекомендуйте действительно стоящие ресурсы, которые
помогут в изучении. Актуальна ли информация в учебниках, которые были написаны пару
лет назад? Заранее спасибо за помощь.
    


Ответы

Ответ 1



"Стоил ли остановиться на этих ресурсах или же искать более современные учебники?" -- пока будете искать новые учебники по версии 3.6 - выйдет версия 3.8. И дальше что? Вердикт - читайте любые книги по Python 3... Если и будут изменения - потом будете разбираться именно в изменениях. Это всегда проще, чем учить "от печки". "в учебниках может быть представлена устаревшая информация и потом придется переучивать." - так и есть. Если хотите заниматься программированием - будьте готовы к тому, что переучиваться придется постоянно, на протяжении всей (профессиональной) жизни. Особенности профессии, так сказать. "Актуальна ли информация в учебниках, которые были написаны пару лет назад?" - вполне актуальна с учетом сказанного в предыдущих двух пунктах. Учтите, что Python - это еще не машинное обучение. Это просто один из инструментов ДЛЯ машинного обучения. Поэтому да, Python - учить надо, но не менее важно начать учить то, что составляет базу машинного обучения (матанализ, линейная алгебра, теорвер,..... и в том числе -программирование), а затем и собственно методы машинного обучения.

Проблема с AngularJS-Slider

#javascript #angularjs


Использую следующую директиву AngularJS slider directive.
Сделал вот такую штуку:



HTML:




JS:

$scope.slider_val = {
        minValue: 1,
        maxValue: 10,
        options: {
            floor: -10,
            step: 1,
            сeil:15,
            noSwitching: true,
            autoHideLimitLabels:true,
            enforceStep:false,
            precision:0
        }
    };


Мои ожидания: линия от -10, до 15, выбран промежуток от 1 до 10.
По факту: линия от -10, до 10, выбран промежуток от 1 до 10.  

Вот пример.



Что мне сделать, чтобы было так, как я хочу?
    


Ответы

Ответ 1



Это очепятка, Вы используете кириллическую "с" вместо латинской "c" в ключе ceil.

Обработка нажатий переключателя

#javascript #html #jquery


Есть 5 переключателей надо чтобы при смене их позиций вкл/выкл менялся цвет текста
рядом с ними.Цвет текста не важен.

Пример:



/* Вторая кнопка */

.cmn-toggle {
  position: absolute;
  margin-left: -9999px;
  visibility: hidden;
}

.cmn-toggle+label {
  display: block;
  position: relative;
  cursor: pointer;
  outline: none;
  user-select: none;
  top: 495px;
  left: 575px;
  z-index: 8;
}

input.cmn-toggle-round+label {
  padding: 2px;
  width: 50px;
  height: 30px;
  background-color: #dddddd;
  border-radius: 60px;
}

input.cmn-toggle-round+label:before,
input.cmn-toggle-round+label:after {
  display: block;
  position: absolute;
  top: 1px;
  left: 1px;
  bottom: 1px;
  content: "";
}

input.cmn-toggle-round+label:before {
  right: 1px;
  background-color: #161616;
  border-radius: 60px;
  transition: background 0.4s;
}

input.cmn-toggle-round+label:after {
  width: 30px;
  height: 32px;
  background-color: #fff;
  border-radius: 100%;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
  transition: margin 0.4s;
}

input.cmn-toggle-round:checked+label:before {
  background-color: #4cda64;
}

input.cmn-toggle-round:checked+label:after {
  margin-left: 21px;
}


/* Третья кнопка */

.cmn-toggle1 {
  position: absolute;
  margin-left: -9999px;
  visibility: hidden;
}

.cmn-toggle1+label {
  display: block;
  position: relative;
  cursor: pointer;
  outline: none;
  user-select: none;
  top: 555px;
  left: 575px;
  z-index: 9;
}

input.cmn-toggle-round1+label {
  padding: 2px;
  width: 50px;
  height: 30px;
  background-color: #dddddd;
  border-radius: 60px;
}

input.cmn-toggle-round1+label:before,
input.cmn-toggle-round1+label:after {
  display: block;
  position: absolute;
  top: 1px;
  left: 1px;
  bottom: 1px;
  content: "";
}

input.cmn-toggle-round1+label:before {
  right: 1px;
  background-color: #161616;
  border-radius: 60px;
  transition: background 0.4s;
}

input.cmn-toggle-round1+label:after {
  width: 30px;
  height: 32px;
  background-color: #fff;
  border-radius: 100%;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
  transition: margin 0.4s;
}

input.cmn-toggle-round1:checked+label:before {
  background-color: #4cda64;
}

input.cmn-toggle-round1:checked+label:after {
  margin-left: 21px;
}


/* Первая кнопка */

.cmn-toggle2 {
  position: absolute;
  margin-left: -9999px;
  visibility: hidden;
}

.cmn-toggle2+label {
  display: block;
  position: relative;
  cursor: pointer;
  outline: none;
  user-select: none;
  top: 337px;
  left: 575px;
  z-index: 7;
}

input.cmn-toggle-round2+label {
  padding: 2px;
  width: 50px;
  height: 30px;
  background-color: #dddddd;
  border-radius: 60px;
}

input.cmn-toggle-round2+label:before,
input.cmn-toggle-round2+label:after {
  display: block;
  position: absolute;
  top: 1px;
  left: 1px;
  bottom: 1px;
  content: "";
}

input.cmn-toggle-round2+label:before {
  right: 1px;
  background-color: #161616;
  border-radius: 60px;
  transition: background 0.4s;
}

input.cmn-toggle-round2+label:after {
  width: 30px;
  height: 32px;
  background-color: #fff;
  border-radius: 100%;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
  transition: margin 0.4s;
}

input.cmn-toggle-round2:checked+label:before {
  background-color: #4cda64;
}

input.cmn-toggle-round2:checked+label:after {
  margin-left: 21px;
}


/* Четвертая кнопка */

.cmn-toggle3 {
  position: absolute;
  margin-left: -9999px;
  visibility: hidden;
}

.cmn-toggle3+label {
  display: block;
  position: relative;
  cursor: pointer;
  outline: none;
  user-select: none;
  top: 576px;
  left: 575px;
  z-index: 7;
}

input.cmn-toggle-round3+label {
  padding: 2px;
  width: 50px;
  height: 30px;
  background-color: #dddddd;
  border-radius: 60px;
}

input.cmn-toggle-round3+label:before,
input.cmn-toggle-round3+label:after {
  display: block;
  position: absolute;
  top: 1px;
  left: 1px;
  bottom: 1px;
  content: "";
}

input.cmn-toggle-round3+label:before {
  right: 1px;
  background-color: #161616;
  border-radius: 60px;
  transition: background 0.4s;
}

input.cmn-toggle-round3+label:after {
  width: 30px;
  height: 32px;
  background-color: #fff;
  border-radius: 100%;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
  transition: margin 0.4s;
}

input.cmn-toggle-round3:checked+label:before {
  background-color: #4cda64;
}

input.cmn-toggle-round3:checked+label:after {
  margin-left: 21px;
}


/* Пятая кнопка */

.cmn-toggle4 {
  position: absolute;
  margin-left: -9999px;
  visibility: hidden;
}

.cmn-toggle4+label {
  display: block;
  position: relative;
  cursor: pointer;
  outline: none;
  user-select: none;
  top: 637px;
  left: 575px;
  z-index: 9;
}

input.cmn-toggle-round4+label {
  padding: 2px;
  width: 50px;
  height: 30px;
  background-color: #dddddd;
  border-radius: 60px;
}

input.cmn-toggle-round4+label:before,
input.cmn-toggle-round4+label:after {
  display: block;
  position: absolute;
  top: 1px;
  left: 1px;
  bottom: 1px;
  content: "";
}

input.cmn-toggle-round4+label:before {
  right: 1px;
  background-color: #161616;
  border-radius: 60px;
  transition: background 0.4s;
}

input.cmn-toggle-round4+label:after {
  width: 30px;
  height: 32px;
  background-color: #fff;
  border-radius: 100%;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
  transition: margin 0.4s;
}

input.cmn-toggle-round4:checked+label:before {
  background-color: #4cda64;
}

input.cmn-toggle-round4:checked+label:after {
  margin-left: 21px;
}

текст

текст

текст

текст

текст


Ответы

Ответ 1



Поднимаемся от чекбокса вверх до ближайшего родителя с классом "switch", в котором находим элемент

: $(".switch input[type='checkbox']").click(function(){ $(this).closest(".switch").find("p"). css("color", this.checked? "green" : "black"); });

Рисование графиков на PHP

#php #графика #график


Как можно рисовать графики в PHP коде? Мне надо, чтобы выглядело примерно так:


    


Ответы

Ответ 1



Здравствуйте! Очень увлёкся Вашим вопросом, и смог добиться результатов. Получилось похоже на ваш график. Вот код с комментариями:

Как создать этот SVG эффект?

#svg #svg_animation


Как мне создать SVG анимацию, как на этой странице http://edwindejongh.co/? Посоветуйте,
пожалуйста, какие-нибудь ресурсы или объясните, что я должна сделать, чтобы воссоздать
такую же страницу?
    


Ответы

Ответ 1



Загляните в стили и скрипты сайта!!! F12 в Chrome Как для старта: setTimeout(function(){ $('.intro__boxes').addClass('animate'); setTimeout(function(){ $('.intro__boxes').addClass('no-transitions'); $('.intro__boxes').addClass('fade-out'); setTimeout(function(){ $('.intro__boxes').removeClass('animate'); setTimeout(function(){ $('.intro__boxes').removeClass('no-transitions'); $('.intro__boxes').removeClass('fade-out'); intro.init(); }, 10); }, 1000); }, 25000); }, 100); * { box-sizing: border-box; } html, body { padding: 0; margin: 0; width: 100%; height: 100%; } .rect { x: 50%; y: 50%; stroke: black; stroke-width: 2px; fill: none; transform-origin: 50% 50% 0; transition: all 25s linear; } .rect1 { opacity: 0.3; transform: translate3d(-50%, -50%, 0) rotate(-15deg) scale(1); } .animate .rect1 { opacity: 0.4; transform: translate3d(-50%, -50%, 0) rotate(-11deg) scale(1.2); } .rect2 { opacity: 0.5; transform: translate3d(-50%, -50%, 0) rotate(0deg) scale(1); } .animate .rect2 { transform: translate3d(-50%, -50%, 0) rotate(10deg) scale(1.2); } .rect3 { opacity: 0.6; transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1); } .animate .rect3 { transform: translate3d(-50%, -50%, 0) rotate(-80deg) scale(1.5); } .rect4 { opacity: 0.8; transform: translate3d(-50%, -50%, 0) rotate(-60deg) scale(0.77); } .animate .rect4 { transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1.34); } .rect5 { transform: translate3d(-50%, -50%, 0) rotate(-45deg) scale(0.77); } .animate .rect5 { transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1.49); } .rect6 { transform: translate3d(-50%, -50%, 0) rotate(-60deg) scale(1); } .animate .rect6 { transform: translate3d(-50%, -50%, 0) rotate(-90deg) scale(2); } .rect7 { transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1); } .animate .rect7 { transform: translate3d(-50%, -50%, 0) rotate(-125deg) scale(2.66); } .intro__boxes.no-transitions .rect { transition-duration: 0s; } .mask { fill: #01051a; } .intro__boxes { position: absolute; z-index: 1; width: 100%; height: 100%; opacity: 1; perspective: 600px; background: linear-gradient(to right, #18f2e0 0%, #183df2 100%); transition: opacity 1s cubic-bezier(0.15, 0.005, 0.155, 1); } .intro__boxes.animate { opacity: 1; } .intro__boxes.fade-out { opacity: 0; }


Какую лучше архитектуру использовать для вычислений на GPU

#cpp #cuda #gpu #opencl


Необходимо перенести вычисления с CPU на GPU. Начал гуглить про это всё, в итоге
есть 2 похожие архитектуры - CUDA от Nvidia и OpenCL от AMD, второе можно и на Nvidia
использовать. Вроде бы пишут, что видеокарты на AMD больше заточены под вычисления
и быстрее на 30-40%.

У кого был опыт программирования на подобном. Можете прояснить пожалуйста, что лучше
выбрать для себя?

Программу пишу на C#, но как понял, класс вычислений придется писать на C++ и подключать
библиотеку к своей программе.
    


Ответы

Ответ 1



Занимаюсь сложными гидродинамическими расчётами на GPU уже давно - OpenCL. По производительности вычислений float карты NVidia всегда опережают AMD с аналогичным количеством и частотой потоковых процессоров. Процентов на 30-50. От использования double лучше по возможности уходить.

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

#html #css


Есть 2 блока, в каждом из которых есть по картинке, по заголовку и по описанию.
Выглядит это так


Как можно сделать так без JS, JQUERY, FLEXBOX? В данном проекте использую display: table;





.cards {
    display: table;
    margin-top: 45px;
}

.card {
    width: 45%;
    text-align: center;
    display: table-cell;
    vertical-align: top;
    height: 100%;
    position: relative;
}

.card-mg {
    width: 10%;
    height: 100%;
}

.card-padding {
    height: 100%;
    padding: 0 5% 0 5%;
}

.card img {
    width: 100%;
}

.card h1 {
    font-weight: 300;
    margin: 5% 0 5% 0;
}

.card h4 {
    font-weight: 100;
}

HEADING

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non, praesentium.

HEADING

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non, praesentium.


Ответы

Ответ 1



Если позволяет сделать фиксированный по высоте блок, то сделать обертку картинке и задать обертке height:220px

HEADING

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non, praesentium.

Стиль .card__img{ height: 220px; }

Ответ 2



Нашел ответ на свой вопрос. Нужно было добавить картинку не через img, а через backgound-image. И к картинке добавить: background-repeat: no-repeat; background-size: cover; background-position: center center;

Ответ 3



Оберните картинки блоками и задайте не фиксированную высоту, а минимальную min-height. И установите приемлемое значение, это должно помочь.

При отправке формы с использованием ajax перезагружается страница

#php #javascript #html #ajax


Здравствуйте при отправке формы с использование ajax перезагружается страница почему
так происходит подскажите ?

var inputName = document.querySelector('#name'); var inputEmail = document.querySelector('#email'); var formSend = document.querySelector('#send'); formSend.addEventListener('click', function() { var params = 'name=' + inputName.value + '&' + 'email=' + inputEmail.value; formAjax(params); }); var formAjax = function(params) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { alert(innerHTML = xhr.responseText); } } xhr.open('POST', 'mail.php'); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.send(params); }


Ответы

Ответ 1



Обработчик должен просигнализировать, что стандартное сабмит-поведение формы не требуется: formSend.addEventListener('click', function() { var params = 'name=' + inputName.value + '&' + 'email=' + inputEmail.value; formAjax(params); return false; // !!! }); или formSend.addEventListener('click', function(event) { event.preventDefault(); // !!! var params = 'name=' + inputName.value + '&' + 'email=' + inputEmail.value; formAjax(params); }); или

Дизайн API: Синтаксис для инициализации прикреплённых свойств

#c_sharp #net #дизайн_api


Пытаюсь выбрать синтаксис для инициализации прикреплённых свойств в своей библиотеке
CsConsoleFormat. Прикреплённые свойства выполняют ту же роль, что и в WPF.

Вот, какие варианты нарисовались. В силу разных причин ни один не нравится.


Индексатор (а.к.а. инициализатор словаря):

var a = new Element {
    Oops = 1, I = 2, Did = 3, It = 4, Again = 5,
    [Element.FooProperty] = 2.1, [Element.BazProperty] = Guid.NewGuid()
};
a.WritePropertyValues();


Плюсы:


Выглядит симпатично, почти как инициализация обычных свойств.
Сочетается с инициализатором объекта на одном уровне.
Работает не только инициализация, но и чтение, и запись.
В Avalonia UI используется похожий синтаксис для биндингов.


Минусы:


Один, но жирный: индексаторы не могут быть обобщёнными, поэтому никакой проверки
типов, везде object. Причём теряется не только проверка, но и конвертация.

Инициализатор коллекции с двумя аргументами:

var b = new Element {
    Oops = 1, I = 2, Did = 3, It = 4, Again = 5,
    Values = { { Element.FooProperty, 2 }, { Element.BarProperty, "Hello!" } }
};
b.WritePropertyValues();


Плюсы:


Строго типизировано.
Можно совместить с индексатором для чтения и записи.


Минусы:


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

Инициализатор коллекции с одним аргументом в сочетании с оператором:

var c = new Element {
    Oops = 1, I = 2, Did = 3, It = 4, Again = 5,
    Values = { Element.FooProperty == 10, Element.BazProperty == Guid.NewGuid() }
};
c.WritePropertyValues();


Плюсы:


Строго типизировано.
Синтаксис умеренно краткий и умеренно приятный.
Можно совместить с индексатором для чтения и записи.


Минусы:


Оператор присваивания не перегружается, приходится перегружать самый низкоприоритетный
бинарный оператор, а он уже достаточно высоко, чтобы портить некоторые выражения (Element.BoolProperty
== a == b).
Равенство для имитации присваивания — не самый логичный ход. Не хочется оказаться
в роли "изобретателя" оператора >> в C++. Впрочем, в Avalonia UI позволяют играться
с операторами, почему бы и мне не.
Если добавлять индексатор для чтения и записи, то получается мешанина: в одном месте
типизировано, в другом нет.

Старый-добрый fluent:

var d = new Element {
        Oops = 1, I = 2, Did = 3, It = 4, Again = 5
    }
    .Set(Element.FooProperty, 1337).Set(Element.BarProperty, "World!");
d.WritePropertyValues();


Плюсы:


Строго типизировано.
Можно совместить с симметричным методом Get.
Если совмещать с Get, то операции симметричные и однообразные.


Минусы:


Синтаксис кошмарный и ужасный, если нужно использовать и обычные, и прикреплённые
свойства (перенести все свойства в fluent — не вариант).



Код, реализующий все синтаксисы, описанные выше:

internal class Program
{
    private static void Main()
    {
        var a = new Element {
            Oops = 1, I = 2, Did = 3, It = 4, Again = 5,
            [Element.FooProperty] = 2.1, [Element.BazProperty] = Guid.NewGuid()
        };
        a.WritePropertyValues();

        var b = new Element {
            Oops = 1, I = 2, Did = 3, It = 4, Again = 5,
            Values = { { Element.FooProperty, 2 }, { Element.BarProperty, "Hello!" } }
        };
        b.WritePropertyValues();

        var c = new Element {
            Oops = 1, I = 2, Did = 3, It = 4, Again = 5,
            Values = { Element.FooProperty == 10, Element.BazProperty == Guid.NewGuid() }
        };
        c.WritePropertyValues();

        var d = new Element {
                Oops = 1, I = 2, Did = 3, It = 4, Again = 5
            }
            .Set(Element.FooProperty, 1337).Set(Element.BarProperty, "World!");
        d.WritePropertyValues();

        Console.ReadKey();
    }
}

internal class Element
{
    public static readonly Property FooProperty = Property.Register("Foo", 1);
    public static readonly Property BarProperty = Property.Register("Bar", "a");
    public static readonly Property BazProperty = Property.Register("Baz",
Guid.Empty);

    private readonly Dictionary _properties = new Dictionary();

    public int Oops { get; set; }
    public int I { get; set; }
    public int Did { get; set; }
    public int It { get; set; }
    public int Again { get; set; }
    public Values Values { get; }

    public Element()
    {
        Values = new Values(this);
    }

    public object this[Property property]
    {
        get => _properties.TryGetValue(property, out object value) ? value : property.DefaultValueUntyped;
        set => _properties[property] = value;
    }

    public Element Set(Property prop, T v)
    {
        _properties[prop] = v;
        return this;
    }

    public void WritePropertyValues()
    {
        foreach (KeyValuePair property in _properties)
            Console.WriteLine($"{property.Key.Type.Name} {property.Key.Name} = {property.Value}
(default: {property.Key.DefaultValueUntyped})");
        Console.WriteLine();
    }
}

internal class Values : IEnumerable
{
    private readonly Element _element;
    public Values(Element element) => _element = element;
    public void Add(Property prop, T v) => _element[prop] = v;
    public void Add(PropertyValue pv) => _element[pv.Property] = pv.Value;
    IEnumerator IEnumerable.GetEnumerator() => null;
}

internal abstract class Property
{
    public string Name { get; }
    public object DefaultValueUntyped { get; }
    public abstract Type Type { get; }

    protected Property(string name, object defaultValueUntyped)
    {
        Name = name;
        DefaultValueUntyped = defaultValueUntyped;
    }

    public static Property Register(string name, T defaultValue) => new Property(name,
defaultValue);
}

internal class Property : Property
{
    public T DefaultValue => (T)DefaultValueUntyped;
    public override Type Type => typeof(T);

    internal Property(string name, T defaultValue) : base(name, defaultValue)
    { }

    public static PropertyValue operator ==(Property property, T value) =>
new PropertyValue(property, value);
    public static PropertyValue operator !=(Property property, T value) => default;
}

internal struct PropertyValue
{
    public Property Property { get; set; }
    public T Value { get; set; }

    public PropertyValue(Property property, T value)
    {
        Property = property;
        Value = value;
    }
}


Возможно, я упускаю как-то более удобный вариант из виду? Есть ещё какие-нибудь альтернативы?
Желательно строго типизированные и с кратким синтаксисом.

Мнения по поводу описанных выше вариантов тоже приветствуются.
    


Ответы

Ответ 1



Лично мне нравится fluent вариант - то, что оно отделено от обычных свойств даже плюс (мухи отдельно, котлеты отдельно). Но если вы хотите получить код короче, то вам придется изобретать конвенкции. Я подумал о анонимных классах, как их используют в asp.net mvc например. var d = new Element { Oops = 1, I = 2, Did = 3, It = 4, Again = 5 } .AddProperties(new { FooProperty = 10, BarProperty = "alkdjalkds", BazProperty = Guid.NewGuid() }); Если уж сильно надо строгую типизацию, то можно как то так сделать public static class Ext { internal static T Value(this Property prop, T value) { return value; // тут можно придумать что то типа AttchedPropertyValue, который можно создать только отсюда } } Тогда .AddProperties(new { FooProperty = Element.FooProperty.Value(10), BarProperty = Element.BarProperty.Value("alkdjalkds"), BazProperty = Element.BazProperty.Value(Guid.NewGuid()) }); Ну, и считать это все как то так public Element AddProperties(object b) { var sourceType = typeof(T); foreach (var p in b.GetType().GetProperties()) { var fieldInfo = sourceType.GetField(p.Name, BindingFlags.Public | BindingFlags.Static); if (fieldInfo == null) throw new ArgumentException("bla bla"); var fieldValue = fieldInfo.GetValue(null) as Property; var value = p.GetValue(b); if (fieldInfo.FieldType.IsGenericType) if (value.GetType()!=fieldInfo.FieldType.GetGenericArguments()[0]) throw new ArgumentException("bla bla bla"); _properties[fieldValue] = value; } return this; }

Ответ 2



У меня тоже вариант с Value: internal class Property : Property { // ... public PropertyValue Value(T t) => new PropertyValue(this, t); } и синтаксисом var e = new Element { Oops = 1, I = 2, Did = 3, It = 4, Again = 5, Values = { Element.FooProperty.Value(10), Element.BazProperty.Value(Guid.NewGuid()) } }; Сильная типизация в наличии. Синтаксис не очень. Ещё один вариант с сильной типизацией, за счёт более сложного определения attached property (которое, впрочем, можно вынести в snippet): var f = new Element { Oops = 1, I = 2, Did = 3, It = 4, Again = 5, Values = { (Element.Foo)10, (Element.Baz)Guid.NewGuid() } }; Достигается следующим изменением кода: interface IPropertyValue { Property Property { get; } T Value { get; } } internal struct PropertyValue : IPropertyValue { // остальное как было } internal class Values : IEnumerable { private readonly Element _element; public Values(Element element) => _element = element; public void Add(Property prop, T v) => _element[prop] = v; // заменили на интерфейс public void Add(IPropertyValue pv) => _element[pv.Property] = pv.Value; IEnumerator IEnumerable.GetEnumerator() => null; } И определение: internal class Element { public static readonly Property FooProperty = Property.Register("Foo", 1); public struct Foo : IPropertyValue { public Property Property => Element.FooProperty; public int Value { get; set; } public static explicit operator Foo(int value) => new Foo() { Value = value }; } public static readonly Property BarProperty = Property.Register("Bar", "a"); public struct Bar : IPropertyValue { public Property Property => Element.BarProperty; public string Value { get; set; } public static explicit operator Bar(string value) => new Bar() { Value = value }; } public static readonly Property BazProperty = Property.Register("Baz", Guid.Empty); public struct Baz : IPropertyValue { public Property Property => Element.BazProperty; public Guid Value { get; set; } public static explicit operator Baz(Guid value) => new Baz() { Value = value }; } private readonly Dictionary _properties = new Dictionary(); // дальше как было