Страницы

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

суббота, 22 февраля 2020 г.

Передача анонимного массива в функцию с++

#cpp11 #cpp14


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

пример 1

void foo(char *arr) {
    cout << arr[2];
};

int main() {
    foo("123");
}


пример 2

void foo(int *arr) {
    cout << arr[2];
};

int main() {
    foo({1,2,3});
}

    


Ответы

Ответ 1



Потому что конструкция вида {1, 2, 3} не является, как Вы выразились, анонимным массивом. Она называется braced-init-list и ведёт себя по-разному, в зависимости от контекста. В Вашей ситуации можно поступить следующим образом: void foo(std::initializer_list arr) { cout << arr.size(); cout << arr[2]; }; Где std::initializer_list - объект, который ведёт себя как контейнер и, по факту, содержит в себе пару указателей, поэтому не сильно нагружает run-time.

Рандомный оттенок

#jquery #цвета


Хочу создать форму, где пользователь нажимает на нужный цвет и скрипт генерирует
случайный оттенок этого цвета.

Я генерирую цвет rgb с помощью random. Но я не могу Придумать, как сделать, что бы
генерировался именно оттенок цвета, а не случайный цвет



$(function() {
  $('#color').change(function() {
    var min = 0, max = 255;
    
    var rgbColor = 'rgb('+(Math.floor(Math.random() * (max - min)) + min)+','+(Math.floor(Math.random()
* (max - min)) + min)+','+(Math.floor(Math.random() * (max - min)) + min)+')';
    
    $('#shade').val(rgbColor).css('border-color', rgbColor);
  });
});
#shade {border: 2px solid #000;}


Выберите цвет:

Оттенок:

Как сделать, что бы генерировался оттенок?


Ответы

Ответ 1



Нужно записывать кода всех оттенков нужных $(function() { $('#color').change(function() { var self = this, // Создаём список цветов colorsModels = { 'red': {'r': '50-255', 'g': '0', 'b': '0'}, 'green': {'r': '0', 'g': '50-255', 'b': '0'}, 'yellow': {'r': '50-255', 'g': 'r', 'b': '0'}, 'blue': {'r': '0', 'g': '0', 'b': '50-255'}, 'grey': {'r': '50-200', 'g': 'r', 'b': 'r'} }; // Проверяем, существует ли цвет указанный в списке if( colorsModels[self.value] !== undefined ){ // Передаём массив цвета в переменную и создаём rgb var model = colorsModels[self.value], rgb = {r: null, g: null, b: null}; // Перебираем каждый цвет из массива for(var key in model){ if( /\d{1,3}\-\d{1,3}/.exec(model[key]) ){ // Проверяем, указано ли значение диапазоном // Вычисляем минимум и максимум с диапазона var min = parseFloat( model[key].replace(/(\d{1,3})\-\d{1,3}/, '$1') ), max = parseFloat( model[key].replace(/\d{1,3}\-(\d{1,3})/, '$1') ); // Вычисляем рандомное число в этом диапазоне var value = Math.floor(Math.random() * (max - min)) + min; // Применяем значение rgb[key] = value; }else if( /\d{1,3}/.exec(model[key]) ){ // Если цвет указан не диапазоном, то проверяем, цифра ли это // Преобразовываем значение в цифру var value = parseFloat( model[key] ); // Применяем значение rgb[key] = value; }else if( model[key] === 'r' || model[key] === 'g' || model[key] === 'b' ){ // Проверяем, ну казано ли значение повторяющим цветом (не равно ли значение пердыдущим цветам) // Проверяем, на допустимость повторения if( (key !== 'r' && key !== model[key]) || (model[key] === 'g' && key !== 'r') ){ // Если всё нормально, то копируем значение rgb[key] = rgb[model[key]]; }else{ console.error('Invalid!'); }; }else{ console.error('Undefined a value color!'); }; }; // Устанавливаем значение var rgbColor = 'rgb('+rgb['r']+','+rgb['g']+','+rgb['b']+')'; $('#shade').val(rgbColor).css('border-color', rgbColor); }else{ console.error('Undefined a color!'); }; }); }); #shade {border: 2px solid #000;}

Выберите цвет:

Оттенок:



Ответ 2



Обычно цвет переводят в цветовую модель HSV, меняют оттенок цвета (Hue) и переводят обратно в RGB. Если нужно поменять насыщенность - Saturation. Если светлоту - Volume. Посмотрите также другие цветовые модели - многие из них "заточены" под разные вещи.

Ответ 3



Для серого цвета надо выбросить один random, и выпавшее значение присваивать всем каналам (r,g,b). Для прочих цветов генерировать значения не в полном диапазоне [0, 255], а раздельно по каналам, отдавая предпочтение тем или иным из них. function limitedRandom (min, max) { return (Math.floor(Math.random() * (max - min)) + min); } red = { r: limitedRandom(150, 255); g: limitedRandom(0, 100); b: limitedRandom(0, 100); }; yellow = { r: limitedRandom(150, 255); g: limitedRandom(150, 255); b: limitedRandom(0, 100); }; // and so on Конкретные границы диапазонов цветов подберите по своему вкусу в графическом редакторе.

Несколько вопросов по XAML (C#)

#c_sharp #wpf #xaml #gui


Написал интерфейс в XAML. До этого пользовался только Windows Form.

Возникло несколько вопросов:


Как сглаживать изображения? На скриншоте может не особо заметно, но картинки выглядят
угловато и это не очень то и красиво.
Кнопки тут у меня, в отличии от WinForm, почему-то выглядят не очень симпатично.
Как убрать стрелку для элементов не влезающих в тулбар?
Как растянуть объект по оставшемуся свободному месту независимо от содержимого. Конкретно
TextBox не принимает значение ширины "*" или
"Star".


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

P.S. Учебник по WPF читаю, но программу надо бы сделать чем раньше, тем лучше, поэтому
ждать пока дочитаю и во всём разберусь ждать не приходится.





    
        
            
                
                    
                        
                    
                
                
                
                    
                        
                    
                
            
            
            
            
        
        
            
                
                
                    
                    
                    
                    
                        
                            
                            
                            
                            
                        

                        
                            
                            
                        

                        
                        
                            
                            
                            
                            
                            
                        

                        
                        
                            
                            
                        

                        
                        

                        
                        
                    
                
            
            
            
                


Ответы

Ответ 1



Сглаживать растровые изображения не нужно. Либо используйте изображение в нативном размере (вот тут много хороших советов), либо переходите наконец на современные технологии и используйте векторные изображения. Кнопки в WPF стилизуются в зависимости от операционной системы. Попробуйте запустить ту же программу на старой системе, думаю, что будет выглядеть так, как вы хотите. Убрать overflow grip проще всего, отредактировав шаблон (правая кнопка мыши в визуальном редакторе в Visual Studio 2015+), есть решение с code-behind здесь. Если вам нужен Toolbar без overflow и с кастомным лэйаутом, используйте вместо него просто DockPanel. Теперь по коду: Вы не используете MVVM. У вас данные жёстко прописаны в UI. Это неправильно, нужно отделять контент от представления и брать данные из VM. Например, список статусов и возможные оценки — точно не сфера компетенции UI. Заодно и код получится проще: и исчезнет дубляж списка оценок. Grid с семью строками и шестью столбцами кажется неоправданно сложным. Я бы поместил Main title name и Second title name в StackPanel или там DockPanel вместе с остатком, а остаток (Эпизодов/Статус/Оценка) положил в Grid с двумя столбцами и тремя строками. Ну и поскольку всего на странице много, я бы разбил на маленькие осмысленные UserControl'ы.

Изменение значения внутри строки

#c_sharp #строки


Есть ли способ изменить значение внутри строки не переводя её в массив символов?
Например "Машинная сила" в "Машинная пила".
    


Ответы

Ответ 1



Нет. Строки в C# неизменяемые, так что вам придётся создавать новую строку, изменить уже существующую строку невозможно*. Если нужна запись символов по индексу, то проще всего перегнать строку в StringBuilder, в котором можно менять значения по индексу, а также добавлять их и удалять. А после окончания обработки снова перегнать в строку: string s = "Машинная сила"; StringBuilder sb = new StringBuilder(s); sb[9] = 'п'; s = sb.ToString(); Если нужно заменить один символ, может быть проще всего откусить подстроку до этого символа и после, и сконкатенировать. Обратите внимание, что в коде у меня каждый раз создаётся новая строка, так что те, кто имел ссылку на старую строку, не увидят изменений. *Ну то есть возможно через unsafe-код или там рефлексию, но если вы так сделаете, ваш тимлид и вся команда прибегут бить вас после первого же code review.

Ответ 2



Можно использовать unsafe-код, если нужно менять строку. Редко когда такое действительно оправдано, но возможно вам нужно чтобы ваш код очень быстро работал. В общем это можно делать на свой страх и риск, когда вы уверены, что вы всё предусмотрели и вам нужна действительно огромная производительность. string s = "Машинная сила"; unsafe { fixed (char* chars = s) { chars[9] = 'п'; } } Чтобы это компилировалось в свойствах проекта следует отметить галочку Allow unsafe code. Побочные эффекты Однако из-за интернирования строк в C# также строки с тем же значением поменяются (спасибо @VladD за эту мысль): public static void Main() { A(); Console.WriteLine("Hello world"); // Выведет "Hello bugs!" } public static unsafe void A() { string s = string.Intern("Hello world"); fixed (char* p = s) { p[6] = 'b'; p[7] = 'u'; p[8] = 'g'; p[9] = 's'; p[10] = '!'; } } Без string.Intern данное поведение также сохраняется.

Как сделать плавную смену css градиента при наведении

#html #css #css3 #вёрстка #hover


Как можно сделать плавную смену фона (градиент на градиент) при наведении hover на
элемент. Сделал кнопку, дал ей все необходимые стили, включая transition для плавности
эффекта наведения, но при этом смена фона происходит резко, а все остальные эффекты
в виде изменения тени, как положено меняются плавно. 



.btn_default {
	display: inline-block;
	min-width: 200px;
	font-family: $bold;
	font-size: 1.125em;
	margin-top: 10px;
	padding: 13px 20px;
	text-align: center;
	color: #fff;
	outline: none;
	border-radius: 30px;
	background: linear-gradient(0deg, rgb(158, 48, 160), rgb(213, 80, 298));
	box-shadow: 0 2px 7px rgba(213, 80, 208, 0.6);
	transition: all 0.5s;
}

.btn_default:hover {
		color: #fff;
		text-decoration: none;
		background: linear-gradient(0deg, rgb(101, 31, 102), rgb(173, 65, 169));
		box-shadow: 0 2px 10px rgba(213, 80, 208, 0.9);
}
Some link



    


Ответы

Ответ 1



Как вариант .btn_default { display: inline-block; min-width: 200px; font-family: $bold; font-size: 1.125em; margin-top: 10px; padding: 13px 20px; text-align: center; color: #fff; outline: none; border-radius: 30px; background: linear-gradient(0deg, rgb(158, 48, 160), rgb(213, 80, 298)); box-shadow: 0 2px 7px rgba(213, 80, 208, 0.6); position: relative; } .btn_default > span{ position: relative; z-index: 1; } .btn_default:after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; color: #fff; text-decoration: none; background: linear-gradient(0deg, rgb(101, 31, 102), rgb(173, 65, 169)); box-shadow: 0 2px 10px rgba(213, 80, 208, 0.9); border-radius: 30px; opacity: 0; transition: opacity 0.5s; } .btn_default:hover:after { opacity: 1; } Some link

Ответ 2



.btn_default { display: inline-block; min-width: 200px; font-weight: bold; font-size: 1.125em; margin: 10px auto; padding: 13px 20px; text-align: center; text-shadow: 0px 0px 1px hsla(0, 0%, 0%, .8); color: #fff; outline: none; border-radius: 30px; background: hsla(294, 53%, 47%, 1); box-shadow: inset .125em .125em .5em hsla(294, 53%, 40%, 1), inset -.125em -.125em .5em hsla(294, 53%, 40%, 1), 0 2px 7px rgba(213, 80, 208, 0.6); transition: all .8s linear 0s; } .btn_default:hover { color: #fff; text-decoration: none; background: hsla(294, 53%, 37%, 1); box-shadow: inset .125em .125em .5em hsla(294, 53%, 30%, 1), inset -.125em -.125em .5em hsla(294, 53%, 30%, 1), 0 2px 10px rgba(213, 80, 208, 0.9); } Some link

Создать map<char[2], long long> на C++

#cpp


Подскажите, пожалуйста, как правильно создать map.
    


Ответы

Ответ 1



Например, можно объявить следующим образом auto cmp = [](const char *a, const char *b) { return ::strcmp(a, b) < 0; }; std::map m(cmp); Однако, так как массивы не имеют оператора присваивания, то лучше объявить ключ, как имеющий тип std::array. Например, #include #include #include int main() { auto cmp = [](const std::array &a, const std::array &b ) { return ::strcmp(a.data(), b.data()) < 0; }; std::map, long long, decltype(cmp)> m(cmp); m.insert({ { { "A" }, 'A' }, { { "B" }, 'B' }, { { "C" }, 'C' } }); for (const auto &p : m) { std::cout << p.first.data() << ": " << p.second << std::endl; } } Вывод программы на консоль: A: 65 B: 66 C: 67 Если map содержит в качестве ключа строки, содержащие два символа помимо завершающего нуля, то нужно объявить ключ как std::array Можно упростить код если в качестве ключа использовать не символьный массив, а тип std::string. Тогда вы можете записать просто std::map m;

Дебаг исходного кода сборок в C# без компиляции сборок в dll

#c_sharp #компиляция


У меня есть несколько компонентов(исходный код библиотеки).

Если скомпилировать все сборки, то получится несколько библиотек dll
Добавив которые в references можно работать с библиотекой.

Как добавить эти сборки в проект, чтобы их не компилировать, а работать с ними как
с исходным кодом и можно было дебажить?

Например:


Library.Assembly1
Library.Assembly2
Library.Assembly3


Все они как разные проекты в студии идут.

После билда получится 3 dll с которыми потом можно работать.

А мне нужно, чтобы эти сборки были в моём проекте и можно было дебажить исходный код.
    


Ответы

Ответ 1



Добавляешь необходимые проекты в одно решение (Solution). Добавляешь ссылки на свои проекты, там где требуется. ПКМ по проекту - добавить ссылку. Теперь можно дебажить свои сборки. Порядок сборки можно изменить в зависимостях проектов.

Ответ 2



Если менять исходный код сборок и компилировать их не требуется, тогда нет необходимости добавлять их проекты в решение. Visual Studio позволяет отлаживать исходный код сборки, если она сможет определить путь к соответствующему PDB файлу этой сборки (он содержит отладочную информацию), а так же путь к исходному коду сборки. Файл PDB создается при компиляции сборки с ключем \debug в той же самой папке, где создается файл сборки (DLL). По умолчанию, компоновщик помещает полный путь и имя связанного PDB-файла в сборку (DLL). При отладке, Visual Studio проверяет, существует ли файл символов в расположении, которое задано в сборке. Но если сборка была скомпилирована не на этом компьютере, то указанного расположения либо не существует, либо PDB файлы находятся не там. В этом случае, путь к PDB файлам можно прописать в настройках (Сервис=>Параметры=>Отладка=>Символы или Tools=>Options=>Debugging=>Symbols). Кроме отладочной информации, PDB файл содержит также сведения о местонахождении исходного кода сборки. Если это местонахождение существует на компьютере, то Visual Studio автоматически открывает соответствующий файл при отладке. Когда отладчик приостанавливает выполнение в месте, для которого отсутствует исходный файл, он отображает страницу Нет исходного кода или Символы не загружены, которая может помочь найти исходный файл. Это сжатый пересказ инструкции описанной в MSDN: Указание файлов символов (.pdb) и файлов с исходным кодом в отладчике Visual Studio. При отладке с помощью PDB файлов, могут возникать трудности с чтением локальных переменных в отладчике. Для избежания этих трудностей, можно сделать две вещи. Отключить главный процесс Visual Studio (Visual Studio Hosting Process). Откройте проект исполняемого файла в Visual Studio. Проекты, которые не создают исполняемые файлы (например, проекты библиотеки классов или службы) не имеют этот параметр. В меню Проект (Project) выберите пункт Свойства (Properties). Перейдите на вкладку Отладка (Debugging). Снимите флажок Разрешить главный процесс Visual Studio (Enable Visual Studio Hosting Process) Подробнее о побочных эффектах связанных с отключением этой опции написано здесь: Практическое руководство. Отключение главного процесса Отключить JIT оптимизацию кода, таким образом избегая несоответствия его источникам, что сильно затрудняет отладку. Это можно сделать при помощи специального ключа в реестре (что влияет на все приложения), но лучше всего запустить Visual Studio из командной строки установив специальную переменную окружения. set COMPLUS_ZapDisable=1 cd /d "%ProgramFiles%\Microsoft Visual Studio 14.0\Common7\ide\" start devenv.exe exit Путь в скрипте выше указывает на Visual Studio 2015. Для другой версии необходимо указать соответствующий номер: VS 2013 - 12.0, VS 2012 - 11.0, VS 2010 - 10.0. Этот трюк позаимствован из блога, в котором он подробно описан: How to disable optimizations when debugging Reference Source.

Круг с тремя разными цветами границ

#html #css #html5 #css3 #svg


У меня есть CSS для круга с одним цветом границы:



.circle {
  border: 6px solid #ffd511;
  border-radius: 30px;
  -moz-border-radius: 30px;
  -webkit-border-radius: 30px;
  -khtml-border-radius: 30px;
  width: 30px;
  height: 18px;
  line-height: 20px;
  padding: 12px 6px;
  text-align: center;
}
17
Как я должен изменить CSS, чтобы иметь три цвета границы - как на часах: От 0 до 4 цвет #1 От 4 до 8 цвет #2 От 8 до 12 цвет #3 Я уверен, что это возможно, с элементом , но мне это не удается. Перевод вопроса: Circle with three different border colors @Legionar


Ответы

Ответ 1



Вы можете создать границу окружности, разделенную на 3 части с помощью inline svg, используя: circle element и атрибут stroke-dasharray для разделения окружности на сектора Ниже пример: svg{width:30%;height:auto;} Edit Для добавления текста внутри окружности, вы можете использовать svg text element svg{width:30%;height:auto;} 17 Перевод ответа: Circle with three different border colors@web-tiki

Соединение округлых площадей

#html #css #css3 #svg #css_animation


Как мне создать логотип,  в соответствии с прикрепленным ниже изображением.  

    

Это то, что я создал:  JsFiddle  

Основная проблема заключается в том, - как можно соединить два блока с фигурой, как
показано на рисунке ниже.
Может кто-нибудь, пожалуйста, предложить, как это сделать?     



body,html {
  width: 100%;
  height: 100%;
  margin: 0;
}
body {
  background-color: #efefef;
}
.wrapper {
  height: 40px;
  width: 40px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -22.5px;
  margin-left: -22.5px;
}
ul {
  list-style-type: none;
  margin: 0 auto;
  padding: 0;
  width: 80px;
  height: 80px;
  position: relative;
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
  transform: rotate(45deg);
}
ul li {
  width: 2em;
  height: 2em;
  position: absolute;
  /*animation: dance 888ms infinite alternate;
  animation-timing-function: cubic-bezier(0.5, 0, 0.5, 1);*/
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
  transform: rotate(45deg);
  animation: dance 888ms infinite alternate;
}
.block-1 {
  top: 0;
  left: 0;
  background: #0076aa;
  border-radius: 4px;
}
.block-2 {
  top: 0;
  right: 0;
  background: #98bd81;
  border-radius: 4px;
}
.block-3 {
  bottom: 0;
  right: 0;
  background: #98bd81;
  border-radius: 4px;
}
.block-4 {
  bottom: 0;
  left: 0;
  background: #0076aa;
  border-radius: 4px;
}
Перевод вопроса: Connecting rounded squares @Sanjeev K


Ответы

Ответ 1



Учитывая трудности выравнивания и создания двойных кривых с помощью CSS, это, очевидно, работа для SVG. Кривые намного легче создавать и контролировать. Вот пример использования: Inline SVG quadratic bezier curves transform Элемент use, поэтому есть только одно вхождение тега path svg{ display:block; width:40%; margin:0 auto;} C анимацией прелоудера svg{ display:block; width:40%; margin:0 auto;} .sq{ animation: opacity .6s infinite alternate; } .gr{ animation-delay:-.6s;} @keyframes opacity { to {opacity: 0;} } Обратите внимание, что вам нужно будет добавить префиксы поставщиков в анимацию, и что анимация элементов svg не поддерживается IE / Edge. Перевод ответа: Connecting rounded squares @web-tiki

Тормозит css-анимация

#html #css #вёрстка #анимация #css_animation


Суть вопроса в следующем. На сайте есть sidebar (выезжающее справа меню), анимация
которого построена на css-transitions. В неактивном состоянии sidebar имеет следующий код:

position: fixed;
top: 0;
bottom: 0;
right: 0;
opacity: 0;
width: 300px;
background: #fff;
z-index: 9999;
-o-transition: all 250ms ease-in-out;
transition: all 250ms ease-in-out;
transform: translate(300px, 0px);


в активном состоянии к нему добавляется класс с таким кодом:

transform: translate(0px, 0px);
opacity: 1;


Проблема в том, что периодически наблюдаются тормоза при открытии/закрытии меню.
Профайлер Google Chrome толком не дает никакой информации по причине подвисаний. На
кадр анимации уходит всего 1-3 ms, но FPS может упасть до 15-20 кадров. Тормоза вылазят
периодически (в эти моменты тормозит вся анимация), из закономерностей заметил, что
они часто появляются в периоды простоя (когда на сайте не совершается никаких действий
20-30 секунд).

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


В чем причина подобных тормозов, кто сталкивался с этим?
Какие решения Вы использовали, чтобы сделать анимацию более плавной?


P.S. "will-change: transform;" не сильно поможет, т.к. браузер и без него все выносит
на отдельный слой.
    


Ответы

Ответ 1



Уберите свойство opacity: 1;. Во-первых, оно бесполезно в данном случае, а во вторых - именно оно может влиять на FPS. Если же вам действительно необходимо скрывать блок, замените opacity на visibility. К примеру, здесь реализовал подобное меню и работает без лагов.

Ответ 2



Добиться более плавной анимации помог комплекс следующих действий: Точное указание property у transition (т.е. вместо "transition: all" указываем конкретное свойство с которым производится анимация). Использование при JS манипуляции с классами не classList, а className. Переход на это решение позволил добиться реального прогресса в плавности анимации. В частности, это решение подсказал VK, там используется такая же схема. Метод className входит в DOM Core (level 2), имеет практически полную совместимость со всеми браузерами, а также более эффективно обрабатывается браузерными движками с минимальными задержками.

Ответ 3



opacity - Вам действительно не нужно. Лучший вариант для плавности анимации это использование translate3D - особенно хорошо работает на моб. устройствах. Вот здесь можно глянуть скорость загрузки: http://jsperf.com/translate3d-vs-xy/28

Исходный код в документации

#java #python #любой_язык #документация #javadoc


Можно ли в Javadoc указывать ссылку на исходный код классов и методов, чтобы не нужно
было каждый раз искать по каталогам нужный файл? Если да, то как это сделать? 

Вот пример для Python: документация SymPy содержит ссылки на исходники классов и методов.

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


Ответы

Ответ 1



У javadoc есть опция -linksource, которая включает исходный код в сгенерированную документацию. Например, в документации Guava есть ссылки на исходники в названиях классов и методов. Если код хранится в другом месте, можно использовать простую HTML ссылку .

Удаленная отладка Visual Studio 2017

#отладка #visual_studio_2017


Для отладки приложений Visual Studio 2015, развернутых на других компьютерах я пользовался
удаленным отладчиком Remote Debugger Visual Studio 2015. Сейчас, решил перейти на Visual
Studio 2017, все успешно, проекты работают и все собирается. Но вот я что-то не могу
найти удаленный отладчик для новой версии среды разработки, где искать? Данного функционала
еще нет? В самой VS2017 есть пункты Debug=>Attach to Process... но где взять сам отладчик,
для установки на сервер? 

На MSDN нашел утилиты для отладки только для 2012, 2013 и 2015 версии: Remote Debugging

Для справки, установлена: Microsoft Visual Studio 2017 Enterprise Edition
Удаленный сервер, где ранее был установлен удаленный отладчик для VS2015 и успешно
работал с ней в паре: Microsoft Windows Server 2012 
    


Ответы

Ответ 1



При установке пункт меню не был создан. Но отладчик нашелся там же, где он был у предыдущих версий - по пути C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Remote Debugger\x64 (ну и соответственно х86-версия рядышком). Сам он есть, просто ярлык не создается. Достаточно скопировать папку x64/x86 на удаленную машину и запустить с правами администратора файл msvsmon.exe

Ответ 2



После долгих поисков на MSDN удаленного отладчика для Visual Studio 2017 нашел одну довольно-таки интересную статью: Remote Debugging, опубликованную 4 ноября 2016 года. Там есть пункт: Download and Install the Remote Tools - это именно то, что нужно. Переходим по ссылке на страницу Visual Studio Downloads, там находим пункт: Tools for Visual Studio 2017, раскрываем список и находим Remote Tools for Visual Studio 2017 и скачивает отладчик нужной версии кликнув на кнопку Download напротив пункта меню. Поиск через поисковые системы Google и Yandex результатов не дал, сумел найти только во внутреннем поиске MSDN. Надеюсь данный вопрос и ответ будут полезны другим участникам.

Как соединить две окружности прямой

#c_sharp #графика


Имеются две окружности одного радиуса R с центрами в точках x1, y1; x2, y2, с произвольным
расположением.

Вопрос: как провести прямую, которая соединяла бы эти окружности, но при этом не
пересекала их? 
Вариант с перерисовыванием окружностей поверх прямой не годится.
Прямую рисую вот так:

Brush red = new SolidBrush(Color.Red);
Pen redPen = new Pen(red, 2);         
gr.DrawLine(redPen, x1, y1, x2, y2);




    


Ответы

Ответ 1



У вас есть окружности с центрами в O1 = (x1, y1) и O2 = (x2, y2), радиуса r. Заведём вектор C, указывающий из центра первой окружности в центр второй: классическое "конечные минус начальные": C = O2 - O1 = (x2 - x1, y2 - y1). Но это смещение, лишённое "базовой точки". Для чего оно? Для того, чтобы вычислить смещение каждого из двух концов искомого отрезка относительно центров окружностей. Если присмотреться, видно, что смещения одинаковы, просто выполнены в прямо противоположные стороны. И направлены они параллельно (коллинеарно, в векторных терминах) C. У нас есть правильно направленный вектор, но неправильной длины. Но длину можно исправить, умножив вектор на число m = r / length(C). Получится вектор S = C * m = (C.x * m, C.y * m). O1 + S это одна точка отрезка, O2 - S другая.

Ответ 2



Я разобрался и нашел более простое решение: double theta = Math.Atan2(y2 - y1, x2 - x1); x1 = x1 + r * cos(theta) y1 = y1 + r * sin(theta) Вторая координата (x2, y2) находится аналогично, только радиус вычитается

Ответ 3



Алгоритм вычисления крайних точек следующий: int x1 = 0, y1 = 0, r1 = 1, x2 = 3, y2 = 4, r2 = 1; // получаем единичный вектор направленный от центра первой окружности ко второй Vector2 norm = Vector2.Normalize(new Vector2(x2-x1, y2-y1)); // удлиняем его на радиусы окружностей Vector2 v1 = Vector2.Multiply(r1, norm); // для конца линии умножаем на отрицательный скаляр - получаем вектор в обратном направлении Vector2 v2 = Vector2.Multiply(-r2, norm); // Искомые точки получаем простым суммированием: Console.WriteLine("(" + (x1+v1.X) +", "+ (y1+v1.Y)+") - (" + (x2+v2.X) +", "+ (y2+v2.Y)+")");

Lua, функциональное программирование

#массивы #алгоритм #функции #lua


Дана задача: в массиве чисел (допустим 1 2 3 4 5 6 7 8 9) реверсировать числа на
нечетных позициях (тут это 1,3,5,7,9, должно получится 9 2 7 4 5 6 3 8 1).
Все это сделать с помощью функционального программирования:
Запрещено использовать циклы, условные операторы, операторы присваивания, операторы
контроля (return можно). Все делать с помощью рекурсий и вызовов других функций.

Вот что я набросал:  

local function main()
array = {};
modArray = {};

--Finding count of nums
file = io.open("nums.txt", "r");
numsArrayString = file:read();

stofSpaces = string.gsub(numsArrayString, "%d", "")
ctofNums = string.len(stofSpaces);
file:close();

--Filling array
file = io.open("nums.txt", "r");
fillArray(array, 0);
file:close();

--1st part
irEnd(array, modArray, 0);
end

function fillArray(array, i)
array[i] = file:read("*n");
pos = endOfArray(ctofNums, i) and fillArray(array, i+1);
end

function endOfArray(a, b)
return a >= b;
end

function irEnd(array, modArray, i)
pos = irEndChecker(i+1) and irEnd(array, modArray, i+2);
modArray[i] = array[i];
print(modArray[i]);
end

function irEndChecker(a)
return a < ctofNums;
end

main();  


print(modArray[i]); выводит все в нужном мне порядке (9,7,5,3,1, и четные между ними),
только вот мне не выводить нужно а присваивать (получается 1,3,5,7,9 в нужном массиве).
Что мне сделать с рекурсивной функцией не только для корректного вывода, но и для конкретного
присваивания?
    


Ответы

Ответ 1



Для начала, приведу полный код решения задачи. Сможете убедиться, что эта мешанина скобок даёт нужный результат. Если после прочтения кода он останется непонятым, если явные отсылки к SICP останутся незамеченными, то прошу листать ниже -- там я попытаюсь объяснить, как работает этот оголтелый псевдолисп. -- Создание пары function cons(_x, _y) return function(m) return (m == 0 and _x) or _y end end -- Получаем "голову" списка (первый элемент) function head(list) return (list ~= nil and list(0)) or nil end -- Получаем "хвост" списка (всё кроме первого элемента) function tail(list) return (list ~= nil and list(1)) or nil end -- Собираем список в строку function list2str(list) return (tail(list) ~= nil and head(list) .. ', ' .. list2str(tail(list))) or head(list) end -- Собираем список из параметров функции function make_list(head, ...) return (... ~= nil and cons(head,make_list(...))) or cons(head, nil) end -- Переворачиваем список function reverse_list(list) return reverse_acc( list, nil ) end -- Сервисная функция с аккумулятором для переворота списка function reverse_acc(list, acc) return (tail(list) ~= nil and reverse_acc( tail(list), cons( head(list), acc ) ) ) or cons( head(list), acc ) end -- Получаем каждый второй элемент списка. От index зависит, -- будут ли это чётные или нечётные элементы function get_sublist(list, index) return (tail(list) ~= nil and (index == 1 and cons( head(list), get_sublist( tail(list), 0)) or get_sublist( tail(list), 1) ) ) or (index == 1 and cons(head(list), nil) ) or nil end -- Получаем нечётные елементы списка function get_odd(list) return get_sublist(list, 1) end -- Получаем чётные елементы списка function get_even(list) return get_sublist(list, 0) end -- Собираем в один два списка {a1, a2, ...} и {b1, b2, ...} -- по принципу: {a1, b1, a2, b2, ...} function megre_lists(list1, list2) return (tail(list1) ~= nil and cons( head(list1), cons( head(list2), megre_lists( tail(list1), tail(list2) )))) or cons( head(list1), head(list2) ~= nil and cons( head(list2),nil) or nil) end function main_task(list) -- Печать первоначального списка print( list2str(list) ) -- Тестирование функции переворачивания списка print( list2str(reverse_list(list)) ) -- Тестирование получения нечётных элементов print( list2str(get_odd(list)) ) -- Тестирование получения чётных элементов print( list2str(get_even(list)) ) -- Получаем список нечётных элементов, переворачиваем его и сливаем со списком -- чётных элементов print ( list2str( megre_lists( reverse_list( get_odd(list) ), get_even(list) ) ) ) end main_task( make_list(unpack( {1, 2, 3, 4, 5, 6, 7, 8, 9} )) ) Начинаем разбираться с принципами функционального программирования. В первую очередь, нам нужен истинно функциональный тип данных. То есть, данные мы будем хранить прямо в функции. И да, этот тип данных -- неизменяемый. function cons(_x, _y) return function(m) return (m == 0 and _x) or _y end end Функция возвращает функциональный тип данных, который будем называть «пара». Этот тип данных содержит два значения. Чтобы эти значения мы могли получать, нам нужно ввести ещё две функции: function head(list) return (list ~= nil and list(0)) or nil end function tail(list) return (list ~= nil and list(1)) or nil end Функция head (голова) позволяет получить первый элемент из пары, а функция tail (хвост) – второй элемент. Почему у функций названия «голова» и «хвост» станет понятно далее. Кстати, уже видно как мы будем обходиться без условного оператора. На самом деле, условный оператор нам нужен. Без него из рекурсии не выйти. Поэтому пользуемся удобным синтаксисом lua и совершенно не меняя логику работы вместо if condition then code1 else code2 end пишем так: condition and code1 or code2 С условным оператором разобрались. Продолжаем делать функциональные типы данных. Нам нужны списки для привычной функциональной парадигмы работы с данными. Для этого мы используем функциональную пару. В первый элемент пары мы записываем первый элемент списка, а во второй – вторую пару. Во второй паре у нас опять значение находится в первом элементе, а во втором – следующая пара. Получается своеобразная цепь из пар. Во втором элементе последней пары в цепи будем устанавливать nil. Это будет признаком конца списка. Функция make_list формирует список из своих аргументов. Вот теперь появляется смысл у названий функций head и tail. Первая функция возвращает первый элемент списка, а вторая – весь остальной список. Как голова удава, и его хвост. Если вы не знакомы с функциональным программированием, то просто поверьте на слово – трёх функций cons, head, tail вполне достаточно для любых работ с функциональными списками. А дальше мы решаем все задачи при помощи функций с рекурсиями. Это как нарисовать сову. Это как на лекции по математике лектор говорит: "отсюда легко видеть". Всё скучно и логично. Скучно для тех, кто знаком с базовыми алгоритмами функционального программирования. Остальных я отсылаю к SICP или любой другой книге по функциональному программированию.

Не получается изменить тип build в unity 5?

#unity3d


В Unity 5 нет типа Unity Web Player в разделе build. Хотя сам  Unity Web Player в
систему я поставил и установил в систему новую версию Unity - вместо 5.4 версию 5.5,
но проблема не решилась. 
    


Ответы

Ответ 1



Браузеры наплевали нагло на weplayer и не поддерживают нифига. Или, как минимум, уже скоро окончательно прекратят поддерживать. Хром давно забил и не воспроизводит. Поэтому Unity >= 5.4 больше не включает такую опцию. Если нужна возможность, то придется работать с Unity версией 5.3 и ниже Но вообще, нужно перебираться на WebGL. Собственно, оно всю малину и испортило))) Типа будущее, все дела. Можно инфу из блога юнити еще глянуть чо каво

Ошибка при добавление поля на событие bitrix 16.5?

#sql #битрикс


Переходим на новую версию php 7 в bitrix 16.5 и я пытаюсь записать в базу имя физического
лица при помощи кода:

https://gist.github.com/vasilukwolf/c2dfaf819de9d9b65a18b0264757c3a0

Однако происходит сбой записи. Пробовал менять события, пробовал просто отправить,
результат один и тот же. Запись заблокирована.
Пытался даже использовать совет:

http://fmwd.ru/stati/cms/1c-bitrix/pochemu-ne-rabotaet-csaleorderpropsvalue.html

Но запись в базу не происходит. Однако все прекрасно пишет в кеш. Вопрос состоит
в том, как записать эту информацию базу, аналогично OnOrderSave:

https://gist.github.com/vasilukwolf/995446e77fedf29014d5bfa640734b94
    


Ответы

Ответ 1



К сожалению, помогло только это: https://stackoverflow.com/questions/11761140/mysql-on-duplicate-key-update-trouble В результате составил прямой запрос: $strSql = "INSERT INTO `b_sale_order_props_value` SET `ORDER_ID`=" . $value_id . ", `ORDER_PROPS_ID`=" . $ar['ID'] . ", `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "' ON DUPLICATE KEY UPDATE `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "';" Который отправил в базу и всё работает. Почему происходит другой запрос в штатной функции bitrix. Я написал запрос в bitrix, возможно еще дополню.

Ответ 2



Вот ответ на вопрос: \Bitrix\Main\EventManager::getInstance()-> addEventHandler("sale", "OnSaleOrderBeforeSaved", "OnSHandler"); function OnSHandler(Bitrix\Main\Event $event) { $order = $event->getParameter("ENTITY"); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if (15 == $p["ID"]) { $family = $property->getField("VALUE"); } if (19 == $p["ID"]) { $name = $property->getField("VALUE"); } if ("PRIVATE_PERSON" == $p["CODE"]) { $property->setValue($name . ' ' . $family); } } } } Публикую с целью CodeReview. Поддержка ответила: ЦИТАТА Вам не нужно писать в базу в этом событии. Вам нужно просто взять коллекцию свойств объекта $order и дописать в нее свои данные, или изменить уже существующие. Система сама потом сохранит всё в базу: $propertyCollection = $order->getPropertyCollection(); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if( $p["CODE"] == "CONTACT_PERSON") $property->setValue("VASYA"); } } С уважением, ведущий специалист отдела технической поддержки Шестопалов Лев При этом мы использовали событие OnSaleOrderBeforeSaved. Допилить мне его помог: https://mrcappuccino.ru/blog/post/work-with-basket-bitrix-d7

Ответ 3



Так а при чем здесь PHP7. У вас черным по белому пишет: нарушение уникальности ключа IX_SOPV_ORD_PROP_UNI. Это не зависит от версии PHP ни коим образом. По всему похоже, что есть некий тригер срабатывающий на обновление записив этой таблице. Вам надо с этим разбираться... Возможно что то не так у вас обновилось при серьезном обновлении или где то обращаетесь к БД в обход АПИ и там что то нкосячили.