Страницы

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

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

Копирование из shared_ptr в unique_ptr

Добрый вечер. Сразу к теме: есть контейнер map> mymap; (MySet - пользовательский тип). Есть другой контейнер: forward_list> myset; Вопрос: как из forward_list копировать элементы в map (из shared_ptr в unique_ptr)?


Ответ

Как я понимаю, объект класса std::map> должен быть владельцем указателей на объекты MySet, а потому при копировании нужно создавать копии объектов, хранящихся в std::forward_list>
Для этих целей можно использовать либо обычный цикл, либо стандартные алгоритмы, как, например, std::transform
Ниже приведена демонстрационная программа, которая показывает, как можно использовать алгоритм std::transform для копирования элементов из одного контейнера в другой. Для наглядности в вызовы конструкторов и деструкторов класса, используемого в качестве базового элемента, я включил вывод на консоль.
#include #include #include #include #include #include #include
struct A { A() { std::cout << "A::A()" << std::endl; } A( const A & ) { std::cout << "A::A( const A & )" << std::endl; } ~A() { std::cout << "A::~A" << std::endl; } A & operator =( const A & ) { std::cout << "A::operator =( const A & )" << std::endl; return *this; } };
int main() { std::forward_list> lst; lst.push_front( std::shared_ptr( new A ) );
std::map> m;
std::transform( lst.begin(), lst.end(), std::inserter( m, m.end() ), []( auto p ) { return std::make_pair( 1, std::unique_ptr
( new A( *p.get() ) ) ); } );
return 0; }
Вывод на консоль будет:
A::A() A::A( const A & ) A::~A A::~A

AsyncTask vs IntentService vs что-то другое при работе с сетью

Есть некоторое приложение, которое по запросу пользователя загружает некоторые данные из сети и отображает их. Сетевые запросы в этом приложении выполняются в отдельном потоке средствами AsyncTask
Ввиду того, что многие категорически советуют не использовать AsyncTask при работе с интернетом (а выносить сетевые запросы в сервис) и возник данный вопрос.
Чуть подробнее:
Суть приложения - отображение списка (текстовых) новостей из нескольких источников.
Как это реализовано сейчас:
Есть активити с Navigation Drawer, в котором отображается список сайтов, по клику на определенный пункт меню появляется фрагмент, содержащий RecyclerView, куда с помощью AsyncTask загружаются данные с выбранного сайта.
При прокрутке RecyclerView до определенного элемента запускается AsyncTask который подгружает в RecyclerView следующую порцию информации и так далее (эдакий Endless RecyclerView).
При выборе другого пункта меню, появляется другой фрагмент, но с таким же принципом работы (просто данные грузятся из другого источника).
При создании каждого из фрагментов выполняется setRetainInstance(true), то есть при изменении конфигурации устройства данные из AsyncTask благополучно вернутся в нужный фрагмент.
Процесс извлечения нужной информации с сайтов организован с помощью Jsoup
Вопросы:
Чем плоха такая архитектура данного приложения? (в части использования AsyncTask и в общем).
Хорошим ли тоном для данной конкретной задачи является использование AsyncTask? Или же стоит перенести работу с сетью в сервис? (я понимаю, что не все типы сервисов работают не в главном потоке).
А если все же стоит перенести работу с сетью в сервис, то при необходимости загрузки данных запускать сервис, загружать данные, возвращать данные во фрагмент и завершать сервис? И так каждый раз?
Честно говоря, хоть и на каждом углу написано, что AsyncTask - это плохо, я не вижу явных причин для вынесения работы с сетью в сервис в данном конкретном приложении. Но раз многие говорят, значит я чего-то не понимаю. Объясните мне это, пожалуйста.
По сути, AsyncTask же предназначен для кратковременных задач, а у меня загружается очень небольшой объем данных (текст), и в итоге AsyncTask как раз отрабатывает за пару секунд.
А основное назначение сервиса - это, насколько я понял, выполнение длительных фоновых задач.
Еще раз повторюсь - я не утверждаю, что в данном случае лучшим решением будет использование AsyncTask, но и аргументов против его использования я не вижу.
А может есть какие-либо другие более правильные архитектурные решения для данной задачи?
Хоть интернет и читал (очень много читал), но буду рад как ссылкам, где описывается что-то подобное (может я пропустил), так и Вашим ответам по данной теме и Вашим мнениям по данному вопросу.


Ответ

Честно говоря, хоть и на каждом углу написано, что AsyncTask - это плохо
Так говорят только те, кто не умеет их готовить. AsyncTask вполне нормальная практика, если вы умеете справляться с пограничными кейсами: поворот экрана, уничтожени контекста и т.п.
AsyncTask не рекомендуют использовать по большей степени потому что есть уже готовые нормальные библиотеки типо Volley, Retrofit и т.п.
Сервисы используются для тяжёлых задач или же для периодических задач.

Почему не работает AJAX скрипт в firefox?

Добрый день! Подскажите, почему нможет не работать AJAX скрипт в firefox? Скрипт отвечает за отправку данных формы(добавление товара в корзину), в Опере и Хроме все нормально. А в firefox форма перенаправляет на ссылку в action из за чего я получаю 404 и товар в корзину не попадает.
$('.main-wrap').on('submit','form#add-product',function() { event.preventDefault(); var a = null, e = null, t = $(this), n = t.find('button[type="submit"]'), r = t.find('input[name="variant"]:checked'), s = t.find('select[name="variant"]'), i = t.find('select[name="size"]'), u = t.find('input[name="size"]:checked'), l = t.find('input[name="amount"]'); console.log(a = r.val()); console.log(e = u.val()); console.log(l.val()); r.size() > 0 && (a = r.val()), l.size() > 0 && (amount = l.val()), s.size() > 0 && (a = s.val()), u.size() > 0 && u.val() > 0 && (e = u.val()), i.size() > 0 && (e = i.val()), 0 != e ? $.ajax({ url: "ajax/cart.php", data: { variant: a, size: e, amount: amount }, dataType: "json", success: function(a) { // $(".error-message").hasClass("size-error") && $(".error-message").removeClass("size-error"), console.log(a['c']); console.log(a['p']); $(".cart-btn").html(a['c']).addClass('cart--active'); $('.popup__body').html(a['p']); } }) : $(".error-message").addClass("size-error")
});

{if $product->sizes|count > '1'}
{foreach $product->sizes as $v} {/foreach}
{/if}


1


Ответ

В Firefox нет глобального объекта event. К счастью, обработчики событий jQuery получают его первым параметром во всех браузерах.
$('.main-wrap').on('submit','form#add-product',function(event) { event.preventDefault(); ...

Инициализация атрибутов базовых классов при множественном наследовании

Не могу разобраться до конца в классах Python. Задаю объекты:
p1 = Point(50,70) # объект класса Point, задающий начальную координату c1 = Color(10,15,10) # задает цвет r1 = Rectangle(p1,40,70,c1) #в нем и загвоздка, а точнее в p1 и c1
Как сделать так, чтобы r1 имел также аргументы x и y и r,g,b, которые имеют p1 и c1 соответственно.
!!! в моем классе Rectangle self.pointIn = pointIn и self.color = color явно заданы неправильно
class Point(object): def __init__(self,x=0, y=0): self.x = x self.y = y
def modify_point(self, x1,y1): self.x = x1 self.y = y1
def to_tuple(self): return (self.x, self.y)
class Color(object): def __init__(self,r=0, g=0, b=0): self.r = r self.g = g self.b = b
def to_tuple(self): return (self.r, self.g, self.b)
class Rectangle(Point, Color): def __init__(self, pointIn, width, hight, color): self.width = width self.hight = hight self.pointIn = pointIn self.color = color


Ответ

Прямоугольник может иметь цвет. Прямоугольник сам по себе цветом не является. То есть логичнее использовать: rectangle.color.r вместо rectangle.r и не наследовать от Color (тем более вы уже используете композицию: self.color определён).
Как сделать так, чтобы r1 имел также аргументы x и y и r,g,b, которые имеют p1 и c1 соответственно.
Если забыть, что это прямоугольники, точки, цвета и рассматривать задачу как упражнение по использованию множественного наследования (которое следует избегать, если вы не знаете точно зачем оно вам нужно в конкретном случае), то чтобы правильно проинициализировать унаследованные атрибуты базовых классов, необходимо вызывать super().__init__(**kwargs)
#!/usr/bin/env python3
class A: def __init__(self, a, **kwargs): super().__init__(**kwargs) self.a = a
def __repr__(self): keys = sorted(self.__dict__) items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) return "{}({})".format(type(self).__name__, ", ".join(items))
class B: def __init__(self, b, **kwargs): super().__init__(**kwargs) self.b = b
class C(A, B): def __init__(self, c, **kwargs): super().__init__(**kwargs) self.c = c
print(C(a=1, b=2, c=3))
super().__init__() вызов только один в C.__init__(), не смотря на то что C имеет два базовых класса.
A.__init__() и B.__init__() существуют и также вызывают super().__init__() и все эти методы имеют совместимые аргументы (за счёт **kwargs). См. Python’s super() considered super!
__repr__ метод (с реализацией из документации types.SimpleNamespace) определён, чтобы напечатать C объект. Вывод показывает, что все атрибуты правильно установлены.
Ключевое понятие здесь—порядок разрешения методов (MRO)—порядок, в котором вызываются методы базовых классов:
>>> [klass.__name__ for klass in C.mro()] ['C', 'A', 'B', 'object']
С.__init__ ожидаемо вызывает родительский A.__init__ (через super().__init__()). A класс не наследует от B, но A.__init__ вызывает (через super().__init__()) B.__init__ согласно MRO, который вызывает object.__init__ и цепочка заканчивается.
object встречается в этом списке только один раз, хотя он является базовым классом как для A так и B классов (то есть C наследует от object класса дважды). Чтобы вычислить порядок вызовов, в Питоне используется C3-линеаризация суперкласса

Как найти максимальный элемент в динамическом массиве с помощью `std::max_element()`?

Как найти максимальный элемент в динамическом массиве с помощью std::max_element()?


Ответ

Вам надо знать размер массива.
Например, если вы создали динамически массив, как показано ниже.
#include
//...
size_t n = 10;
int *a = new int[n];
// заполнение значениями элементов массива
int *max = std::max_element( a, a + n );
if ( max != a + n ) { std::cout << "The maximum element is equal to " << *max << std::endl; }
Или итератор можете объявить, используя спецификатор auto
auto max = std::max_element( a, a + n );
В данном конкретном случае нет необходимости проверять, что максимальный элемент найден. Но в общем случае, когда вы априори не знаете, чему равно значение переменной n, то такую проверку лучше делать.
Чтобы определить позицию найденного элемента, вы, в принципе, можете просто вычесть начало массива из найденного итератора, как, например,
auto pos = max - a;
Однако с точки зрения стиля программирования лучше воспользоваться стандартной функцией std::distance, объявленной в заголовке , Например,
#include
//...
auto = std::distance( a, max );
Это делает ваш код более гибким, так как массив вы можете заменить, например, каким-нибудь стандартным контейнером, который не имеет итераторов прямого доступа, и код все равно будет работать.

Получить имена всех файлов в папке на PL/SQL (Oracle XE)

Есть папка (локально) С:\LB в которую некто закидывает файлы. Мне необходимо (периодически, через определенное время) получать имена всех этих файлов, и если в этих именах есть то имя, которое мне надо, я цепляю этот файл (.PDF) к определенной записи в таблице.
Пока я работаю над получением списка имен файлов:
create global temporary table DIR_LIST (filename varchar2(255)) on commit delete rows; /
create or replace and compile java source named "DirList" as import java.io.*; import java.sql.*;
public class DirList { public static void getList(String directory) throws SQLException { File path = new File( directory ); String[] list = path.list(); String element;
for(int i = 0; i < list.length; i++) { element = list[i]; #sql { INSERT INTO DIR_LIST (FILENAME) VALUES (:element) }; } } } /
create or replace procedure get_dir_list( p_directory in varchar2 ) as language java name 'DirList.getList( java.lang.String )';
БД 11g XE и я не могу развернуть JAVA внутри. Писать внешний JAR-ник не совсем актуально. Я так понимаю нужен шедулер и JOB, но все форумы говорят что на чистом PL/SQL этого (получить имена файлов и превратить их в таблицу) написать нельзя. Ок. Возможно можно развернуть .NET классы внутри БД, обернув в процедуру? Как с классами JAVA. Уверен, кто-то определенно с этим сталкивался. Буду благодарен за подсказки!


Ответ

Можно с помощью внешних таблиц реализовать:
mkdir /tmp/stage
cat >/tmp/stage/readdir.sh<for i in {1..5}; do touch /tmp/stage/invoice_no_$RANDOM.pdf; done
В sqlplus:
create or replace directory stagedir as '/tmp/stage'; --Directory STAGEDIR created.
create table files (filename varchar2(255)) organization external ( type oracle_loader default directory stagedir access parameters ( records delimited by newline preprocessor stagedir:'readdir.sh' fields terminated by "|" ldrtrim ) location ('readdir.sh') ); / --Table FILES created.
select * from files;
FILENAME -------------------------------------------------------------------------------- FILES_27463.log invoice_no_20891.pdf invoice_no_2255.pdf invoice_no_24086.pdf invoice_no_30372.pdf invoice_no_8340.pdf readdir.sh
7 rows selected
Можно также с разовым job, но это решение будет явно потяжелей, т.к. стандртный вывод нельзя на прямую вернуть в вызывающую процедуру. Зато, как клиент пожелал, всё будет в pl/sql.

Загрузить страницу с нужным содержимом


Подскажите, пожалуйста, как при нажатии на Проверка_1 загрузить страницу с одним текстом, а при нажатии Проверка_2 - с другим? То есть, чтобы не делать для каждого текста новую страницу (html).


Ответ

Можно сделать 2 блока с текстом и по умолчанию скрыть их. При нажатии на Проверка_1 с помощью javascript нужно отобразить блок с текстом, и так же для второго блока.
$("#check_1").click(function(){ $("#text_1").toggleClass("hidden"); }); $("#check_2").click(function(){ $("#text_2").toggleClass("hidden"); }); .hidden { opacity: 0; } .textbox { width: 50px; height: 50px; border: 1px solid red; }


Абстракция или конкретная реализация?

В книге Философия Java не раз употребляется фраза вроде:
Вспомните совет, данный в конце предыдущей главы: отдавать предпочтение классам перед интерфейсами. Если архитектура системы требует применения интерфейса, вы это поймете. В остальных случаях не применяйте интерфейсы без крайней необходимости.
Вместе с тем, почти во всех книга по ООП и паттернам говорится, что предпочтение всегда (!) должно отдаваться абстракции, а не реализации.
Реального опыта программирования на Java не имею, поэтому такие противоречивые высказывания сбивают с толку. Кому верить ?


Ответ

Далее в книге есть такие слова:
"В общем случае рекомендуется отдавать предпочтение классам перед ин­терфейсами. Начните с классов, а если необходимость интерфейсов станет оче­видной — переработайте архитектуру своего проекта. Интерфейсы — замеча­тельный инструмент, но ими нередко злоупотребляют."
Однако если проект разросся до огромных размеров, то фраза "переработайте архитектуру" выглядит очень сомнительной. Как-от слабо себе представляю большой проект в котором так легко можно сказать "переработайте архитектуру." Это как раз тот вид ошибок, который трудно исправлять. По-моему мнению, даже если существует только одна реализация - то лучше применять интерфейс. Кроме того, обычно интерфейсы сопровождаются вынесением зависимостей классов друг от друга во внешний ресурс (например, в xml файл) - что в больших проектах есть необходимость.

Сохранение сгенерированной страницы html

У меня есть страница с кучей JS скроптов(загрузка изображения, динамическая таблица, блоки которые перемещаются мышкой). Суть такая пользователь зашел заполнил таблицу(см рисунок), расставил блоки по местам, и из всего этого по кнопке сохранить надо создать страницу, как нибудь ее обозвать и положить на сервер. По сути на этой странице должно быть только сгенерированные таблицы и блоки со своими координатами.
Вопрос в том как средствами php или js выдернуть определенные div блоки создать html и положить содержимое div в созданный html или php файлик(тоесть таких файликов планируется, будет много).


Ответ

Так как изменяемые данные только координаты и значения в таблице, то формируем универсальную страницу готовую принять данные и воспроизвести созданное пользователем поле из блоков. Это будет костяком страницы. Далее:
Старый проверенный способ:
Итак имеем: "A" -массив блоков.
Хранимая информация: номер блока, название, координаты. массив "B" - значения ячеек таблицы. (добавляем столбец номер блока)
По кнопке сохранить отправляем POST-запрос на сервер имеющиеся у нас массивы "А" и "В" ( делается средствами js, рекомендую задействовать localstorage)
Принятая информация заносится в базу данных, с привязкой к пользователю.
Для воспроизведения повторно:
После авторизации на сайте, загружаем из базы данных значения, раставляем по координатам блоки, соответственно значения таблиц подтягиваем ajax по мере надобности.
Современный способ:
Развертываем веб-сокеты, постоянно обмениваемся информацией с сервером.

Странность с binding wpf

Есть разметка XAML:

Так вот, в этом случае связывание не срабатывает - отображаемый элемент - пустой. А вот если это сделать в c# коде и убрать с XAML - вуаля, все работает:
PathListView.ItemsSource = ViewModel.MainViewModel.SettingModel.CollectionPaths;
В чем разница между тем, как привязывать, в xaml или c# коде? Почему в одном случае работает, а в другом - нет? Обе коллекции ObservableCollection<>
UPD Код модели:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization.Json; using System.Runtime.Serialization;
namespace DocumentAdder.Model { [DataContract] public class SettingsModel : BaseModel { #region Fields private string _pathToDirectory; private string _fileTypes; private ObservableCollection _collectionPaths; #endregion
#region Properties
///

/// Представляет собой путь к папке с файлами, которые следует обработать /// /// PathToDirectory свойство задает/возвращает значение типа string поля, _pathToDirectory [DataMember] public string PathToDirectory { get { return _pathToDirectory; } set { _pathToDirectory = value; NotifyPropertyChanged(); } }
/// /// Предоставляет данные о типах текстовых файлов, которые необходимо сканировать и обрабатывать /// FileTypes свойство возвращает значения типа string поля, _fileTypes /// [DataMember] public string FileTypes { get { return _fileTypes; } private set { _fileTypes = value; NotifyPropertyChanged(); } }
/// /// Возвращает коллекцию всех путей, с которых нужно обработать файлы /// /// CollectionPaths свойство возвращает значение типа ObservableCollection поля, _collectionPaths [DataMember] public ObservableCollection CollectionPaths { get { return _collectionPaths; } private set { _collectionPaths = value; NotifyPropertyChanged(); } } #endregion
/// /// Создает модель настроек, /// инициализирует коллекцию путей к директориям, где лежат файлы, /// задает возможные форматы файлов для чтения. /// public SettingsModel() { _fileTypes = "*.txt, *.doc, *.docx, *.rtf, *.otd, *.pdf"; CollectionPaths = new ObservableCollection(); } } }
Код ViewModel:
using DocumentAdder.Helpers; using DocumentAdder.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using Microsoft.WindowsAPICodePack.Dialogs;
namespace DocumentAdder.ViewModel { public class MainViewModel { public MainModel DocumentAdderModel { get; private set; } public static SettingsModel SettingModel { get; set; }
#region Commands //main programm commands public ICommand StartProgrammCommand { get; private set; } public ICommand StopProgrammCommand { get; private set; } public ICommand RestartProgrammCommand { get; private set; }
//settings commands public ICommand AddLocalStorageCommand { get; private set; } #endregion
#region Methods //main programm methods
//settings methods private void addLocalStorage() { List selectedPaths = null; var cofd = new CommonOpenFileDialog(); cofd.IsFolderPicker = true; //cofd.Title = ""; cofd.Multiselect = true; if (cofd.ShowDialog() == CommonFileDialogResult.Ok) { selectedPaths = cofd.FileNames.ToList(); } if (selectedPaths != null) { foreach (var item in selectedPaths) { SettingModel.CollectionPaths.Add(item); } } }
private void addFTPStorage() {
} #endregion
static MainViewModel() { if (SettingModel == null) { var single = new SettingsModel(); SettingModel = single; } }
public MainViewModel() { DocumentAdderModel = new MainModel(); AddLocalStorageCommand = new DelegateCommand(arg => addLocalStorage()); } } }
Код XAML окна:

Не удается вывести текст из файла в кодировке UTF8, содержащий кириллицу на консоль

Не получается прочитать текст, включающий в себя кириллицу и вывести на консоль из файла, который имеет кодировку UTF8. Имеется следующий код:
#include #include #include #include #include
int main(int argc, wchar_t* argv[]) { std::wcout.imbue(std::locale("rus_rus.866")); std::wcin.imbue(std::locale("rus_rus.866"));
std::wfstream fout;
fout.open(L"cd.txt", std::ios::in);
if (fout.is_open()) { fout.imbue(std::locale("rus_rus.1251"));
wchar_t ch; std::wstring inputT; while (fout.get(ch)) inputT += ch; std::wcout << inputT; std::wcout << std::endl;
fout.close(); } std::cin.get(); return 0; }
Причем если читаемый файл имеет кодировку ANSI, весь текст включая русские буквы отображается корректно, но если файл в кодировке UTF8, то отображается что то вообще не то. Как это можно исправить?


Ответ

Проблема делится на две части: как вывести текст и как прочитать его.
Для вывода имеет смысл воспользоваться рекомендацией отсюда (_setmode(_fileno(...), _O_U16TEXT); и использование std::wstring).
Это означает, что нам нужно прочитать из файла строки из utf-8 в формат wstring. Это делается так
fout.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8));
(и должно работать вне зависимости от ширины wchar_t). Вы используете std::locale("rus_rus.1251"), это не должно работать.

Неожиданное поведение preg_replace()

Есть задача удалить из текста последний перевод строки
, если за ним нет символов, либо его же и пробелы следующие за ним, если кроме пробелов до конца текста нет других символов.
Использую preg_replace() и регулярное выражение %
\x20*$%
Тест выдающий ожидаемое поведение при замене:
$text = "abcd

"; var_dump(preg_replace('%
\x20*$%', '', $text, -1, $count), $count); var_dump(preg_replace('%
\x20*$%', '', $text, 1, $count), $count);
Результат работы:
string 'abcd ' (length=10) int 1
string 'abcd ' (length=10) int 1
Тест выдающий неожиданный результат:
$text = "abcd

"; var_dump(preg_replace('%
\x20*$%', '', $text, -1, $count), $count); var_dump(preg_replace('%
\x20*$%', '', $text, 1, $count), $count);
Результат работы:
string 'abcd' (length=4) <== замена прошла два раза, int 2 <== вместо одного как ожидалось
string 'abcd ' (length=5) <== "съежены" пробелы до символа перевода строки, int 1 <== даже при выполнении всего 1ой замены
Вопрос: В чем моя ошибка?
P.S. Аналогичное регулярное выражение для начала текста работает как ожидалось во всех случаях.


Ответ

По умолчанию, PCRE обрабатывает данные как однострочную символьную строку (даже если она содержит несколько разделителей строк). Метасимвол начала строки '^' соответствует только началу обрабатываемого текста, в то время как метасимвол "конец строки" '$' соответствует концу текста, либо позиции перед завершающим текст переводом строки (в случае, если модификатор D не установлен).
Т.е. $ трактуется как конец строки ПЕРЕД
, если он является последним символом.
В вашем случае надо использовать модификатор D
$text = "abcd

"; var_dump(preg_replace('%
\x20*$%D', '', $text, -1, $count), $count); var_dump(preg_replace('%
\x20*$%D', '', $text, 1, $count), $count);
string(10) "abcd " int(1) string(10) "abcd " int(1)

Реализация альтернативного ToolTip

Всем привет. Есть необходимость сделать альтернативную версию ToolTip. Выбрал WebBrowser на второй форме. Задача такая при наведении на Textbox в form1 должна появляться Form2,на которой и есть тот самой WebBrowser.Но проблема в том что при перемещении мышки на Textbox в Form1, Form2 должна следовать за ним. Но тогда Form1 начинает мигать при каждом появлении Form2. Как сделать так чтобы Form1 не мигала при появлении Form2?
Form2 form2; private void Texbox1_MouseEnter_1(object sender, EventArgs e) { form2 = new form2(); form2.show(Texbox1); } private void Texbox1_MouseLeave_1(object sender, EventArgs e) { f2.Close();
}


Ответ

Не нужно каждый раз создавать (new) и уничтожать (Close) форму - это слишком накладно. Создайте вторую форму один раз (например, в конструкторе основной формы) и показывайте-скрывайте в нужные моменты.
Для этого задайте текстбоксу следующие обработчики событий:
private void TextBox_MouseMove(object sender, MouseEventArgs e) { form2.Location = new Point(MousePosition.X + 5, MousePosition.Y); }
private void TextBox_MouseEnter(object sender, EventArgs e) { if (form2.Visible) return;
form2.Location = new Point(MousePosition.X + 5, MousePosition.Y);
// Здесь задавайте данные на этой форме-тултипе
form2.Show(this); }
private void TextBox_MouseLeave(object sender, EventArgs e) { if (textBox.ClientRectangle.Contains(textBox.PointToClient(MousePosition))) form2.Location = new Point(MousePosition.X + 5, MousePosition.Y); else form2.Hide(); }
Правда, здесь есть недостаток: если основная форма деактивируется при показанной форме-тултипе (например, нажать Atl+Tab или выскочит окошко другого приложения), то наш тултип не скроется. Думаю, это не страшно: достаточно двинуть мышкой на текстбоксе.
Для устранения этого недочёта можно применить таймер, но это тоже как-то не комильфо.

Вообще, использовать форму в качестве тултипа - слишком тяжеловесно. К тому же, именно из-за способности форм (де)активироваться возникает проблема корректного показа обеих.
Достаточно взять Panel (или любой другой компонент-контейнер), на неё поместить всё необоходимое (WebBrowser или RichTextBox). Изначально этой панели задайте свойство Visible = false (скрыта). Родителем панели должна быть сама основная форма (Parent = this). Эту панель нужно разместить перед всеми другими, поэтому вызовите для неё метод panel.BringToFront();
Код в обработчиках событий почти тот же:
private void TextBox_MouseMove(object sender, MouseEventArgs e) { var point = textBox.PointToClient(MousePosition); panel.Location = new Point(point.X + 5, point.Y); }
private void TextBox_MouseEnter(object sender, EventArgs e) { if (panel.Visible) return; var point = textBox.PointToClient(MousePosition); panel.Location = new Point(point.X + 5, point.Y); panel.Show(); }
private void TextBox_MouseLeave(object sender, EventArgs e) { if (textBox.ClientRectangle.Contains(textBox.PointToClient(MousePosition))) { var point = textBox.PointToClient(MousePosition); panel.Location = new Point(point.X + 5, point.Y); } else panel.Hide(); }
И ещё нужно добавить обработку события деактивации основной формы:
private void Form1_Deactivate(object sender, EventArgs e) { panel.Hide(); }
Наша панель-тултип будет корректно скрываться.

Миграции с несколькими DbContext

Классы:
public class Document { public int Id { get; set; } public string Title { get; set; } public int UserId { get; set; }
///

/// пользователь который создал документ /// public User User { get; set; } }
public class User { public int Id { get; set; } public string UserName { get; set; } }
Два DbContext'a
public class UserContext : DbContext { public UserContext() : base ("name=ConnectionStringName") { }
static UserContext() { Database.SetInitializer(null); }
public DbSet Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("User"); base.OnModelCreating(modelBuilder); } }
class DocumentContext : DbContext { public DocumentContext() : base("name=ConnectionStringName") { }
static DocumentContext() { Database.SetInitializer(null); }
public DbSet Documents { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("Document"); modelBuilder.Entity().ToTable("Users", "User"); base.OnModelCreating(modelBuilder); } }
UserContext - хранит данные пользователей (User, Roles, ExternalLogins ...).
DocumentContext -
создаю миграцию для UserContext. В базе создается схема с нужными таблицами
создаю миграцию для DocumentContext, в методе Up EF пытоется создать таблицу которая уже существует, из-за чего я получаю ошибку:
There is already an object named 'Users' in the database.
public partial class InitialDocument : DbMigration { public override void Up() { CreateTable( "Document.Documents", c => new { Id = c.Int(nullable: false, identity: true), Title = c.String(), UserId = c.Int(nullable: false), }) .PrimaryKey(t => t.Id) .ForeignKey("User.Users", t => t.UserId, cascadeDelete: true) .Index(t => t.UserId);
//EF пытается создать таблицу в схеме User, //Но она уже создана другой миграцией (UserMigrations) //поэтому выходит ошибка - There is already an object named 'Users' in the database. //Как объяснить EF чтобы чтобы он не создавал эту таблицу? CreateTable( "User.Users", c => new { Id = c.Int(nullable: false, identity: true), UserName = c.String(), }) .PrimaryKey(t => t.Id); } //скрыто }
Вопрос - Как объяснить EF чтобы чтобы он не создавал таблицу user?
Update
Как временное решение я удаляю кусок кода который создает миграция


Ответ

Делать миграции по разным (нескольким) контекстам - не очень удобно, да и не очень хорошо. Насколько мне известно, кроме как руками фиксить данные проблемы, то есть убирать из методов Up и Down код, который Вам не нужен - не получится.
EntityFramework достаточно умен, но решить эту проблему навесив пару атрибутов или через OnModelCreating не получится (используя modelBuilder.Ignore()), хотя, может быть в скором времени EntityFramework справится с такой задачей, именно для одной базы данных.
Даже если начинает получаться что-то сделать на подобии того, что Вы хотите - столкнетесь с проблемой, которая приведет к провалу. Если убрать из классов ссылки на другие классы в свойствах - то он не будет подтягивать других таблиц, но тогда не создаст внешних ключей.
Если использовать modelBuilder.HasDefaultSchema("schema") а затем при добавлении миграции, указать полное имя Вашего класса конфигурации (полученного из DbMigrationsConfiguration) в качестве параметра в add-migration, таким образом:
add-migration NAME_OF_MIGRATION -ConfigurationTypeName FULLY_QUALIFIED_NAME_OF_CONFIGURATION_CLASS
Тоже Вам не подойдет и вряд ли поможет.
Решение данной коллизии я вижу таким: создать обобщенный контекст и выполнять миграции для одного контекста. Так Вы не потеряете изменений и будет меньше конфликтов. Ссылка из комментария - Entity Framework: One Database, Multiple DbContexts. Is this a bad idea? - очень хороший пример.
Если Ваш проект будет не слишком большим и разделение моделей будет минимальным, то этот подход будет прост. Но если у Вас будет много моделей, несколько контекстов, общие классы и наследование - то придется немного напрячься. EntityFramework очень любит наследование.

Ожидание загрузки картинки [дубликат]

На данный вопрос уже ответили: Контроль порядка выдачи результатов асинхронной операции 1 ответ Мне нужно в цикле загрузить картинку и продолжить выполнение кода. Метода wait() у картинки нет :) что мне такое написать в onload(), чтобы выполнение цикла продолжалось только после загрузки картинки?
for(var i in images){ var img = new Image(); img.src = images[i]; img.onload(тут код); }
UPD:
вот сам объект с путями картинок
var images = { "image1": "screen001.PNG", "image2": "Снимок.PNG", "image3": "doctype.png" };


Ответ

В данном случае можно так
var images = [];
function loadImage(index) { var img = new Image(); img.src = images[index]; img.onload = function() { if (index + 1 < images.length) { loadImage(index + 1); } }; }
loadImage(0);
UPD Если images это object, то моя реализация такая
var images = { "image1": "screen001.PNG", "image2": "Снимок.PNG", "image3": "doctype.png" };
var arr = getObjectKeys(images);
function getObjectKeys(o) { var tmp = [];
for (var key in o) { tmp.push(key); }
return tmp; }
function loadImage(index) { var img = new Image(); img.src = images[arr[index]]; img.onload = function() { if (index + 1 < arr.length) { loadImage(index + 1); } }; }
loadImage(0);
Если картинка загрузится не успешно, то onload не выполнится

Что такое энтерпрайз(Enterprise) в контексте программирования?

Иногда встречаю понятие энтерпрайз программирование или энтерпрайз код. Какое этому понятию можно дать определение ? И почему часто это употребляется как что-то негативное?
P.S. Понимаю что вопрос не зависит от языка, но ответ интересует относительно .Net платформы.


Ответ

Всякие сервисы, базы данных и их интеграции между собой. Чаще всего это инфраструктура организаций, всякие CRMы, 1Сы и прочее. Нелюбимо творческими программистами за то, что это b2b, которым нельзя похвастаться перед друзьями, а Ъ-программисты ругают "галерных" программистов, что работа эта не творческая, рутинная, а исполнители - бестолковые и неквалифицированные, которые не могут в бородатые стартапы. Ну и так как этими системами клиентов не завлекают, то там гнездятся тонны легаси-кода.
Можно сказать, что зависит от языка. В подавляющем большинстве случаев это Java и .NET.

Почему не отображаются картинки при запуске программы?

Вместо картинок пустое место. Дальше отображаются картинки стандартные которые уже были в этом проекте.
Но картинки отображаются при просмотре в Visual Studio.


Ответ

Проверьте пути до папок с картинками. У вас exe компилируется в папке bin/debug/ или bin/release/ относительно основного проекта. Варианты решения:
Добавить в пути к картинкам "../../ваш путь". Но это плохое решение. Когда соберёте installer, вам придётся пути переписывать и, скорей всего, не будет отображаться в студии Перекинуть папку с картинками в директории, в которых собирается проект. Тоже решение так себе - при каждом изменении/добавлении картинок заново их закидывать Добавить у папки с картинками в свойствах значение "Copy to output directory" как "Copy always" или "Copy if never". Это уже нормальное решение. Добавлять все ваши файлы как ресурсы (я бы так делал).

mipmap и drawable - в каких случаях использовать

Здравствуйте! В проекте, над которым сейчас работаю, ВСЕ изображения были помещены предыдущим разработчиком в mipmap-xxxx. В drawable остались только .xml файлы. Мне казалось, что mipmap должны использоваться только для иконок приложения. Собственно вопрос - на сколько правильно хранить ВСЕ изображения в mipmap или же это ошибка? Было бы хорошо, по возможности, использовать в ответах ссылки на документацию


Ответ

Вы правильно написали, что mipmap обычно используется для иконок приложения. mipmap появились в android 4.3 Mipmapping for drawables. В данном статье описано почему лучше для иконок использовать mipmap. Если кратко, то когда ваши иконки расположены в drawable - [разрешение], то могут возникнуть проблемы отображения иконки не того размера.

Выделение памяти под двумерный массив malloc

Кто может показать пример функции, которая выделит память под двумерный массив и вернет его если это вообще возможно. И какие параметры нужно передать в эту функцию что бы достичь желаемого результата. Массив в итоге будет заполнен отдельными словами.


Ответ

Казалось бы, что может быть прямолинейнее, чем выделение динамически памяти под двумерный массив, а потому должно существовать одно решение.
На самом деле можно по-разному реализовать данную задачу.
Самый простой способ - это когда число колонок в двумерном массиве является константным значением, определенным либо с помощью директивы #define либо с помощью перечислителя. Тогда можно сразу же разместить динамически именно двумерный массив.
Второй подход, это когда число колонок задается во время выполнения программы. В этом случае обычно выделяют несколько одномерных массивов. Сначала выделяют одномерный массив указателей с количеством элементов равных количеству строк в предполагаемом двумерном массиве, А затем для каждого указателя этого одномерного массива выделяют массив объектов базового типа, число элементов которого равно числу колонок в двумерном массиве. В этом варианте важно учитывать, что во время выделения массивов может возникнуть нехватка памяти, а потому желательно правильно удалить те массивы, которые были уже распределены, а иначе программа будет иметь неопределенное состояние.
Третий подход заключается в использовании массивов переменной длины при условии, что C компилятор их поддерживает. Тогда число колонок и строк может быть задано во время выполнения программы, и можно выделить сразу же двумерный массив, а не массив массивов, как было описано в предыдущем абзаце.
Также следует не забывать корректно освобождать выделенную динамически память под массивы, когда массивы уже не нужны.
Ниже приведена демонстрационная программа, в которой показаны перечисленные способы выделения памяти для работы с двумерными массивами или их аналогами.
#include #include #include
#define COLS 10
char ( * first_allocate( size_t rows ) )[COLS] { char ( *s )[COLS] = malloc( rows * sizeof( char[COLS] ) );
return s; }
void first_free( char ( *s )[COLS] ) { free( s ); }
char ** second_allocate( size_t rows, size_t cols ) { char **s = malloc( rows * sizeof( char * ) );
if ( s != NULL ) { size_t i = 0;
while ( i < rows && ( s[i] = malloc( cols * sizeof( char ) ) ) != NULL ) i++;
if ( i != rows ) { for ( size_t j = i; j != 0; j-- ) free( s[j-1] ); free( s ); s = NULL; }
}
return s; }
void second_free( char **s, size_t rows ) { for ( size_t i = 0; i < rows; i++ ) free( s[i] ); free( s ); }
void third_allocate( size_t rows, size_t cols, char ( **s )[rows][cols] ) { *s = malloc( sizeof( char[rows][cols] ) ); }
void third_free( size_t rows, size_t cols, char ( *s )[rows][cols] ) { free( s ); }

int main( void ) { size_t rows = 2; size_t cols = 10;
char ( *s1 )[COLS] = first_allocate( rows ); strcpy( s1[0], "first" ); strcpy( s1[1], "second" );
for ( size_t i = 0; i < rows; i++ ) printf( "%s ", s1[i] ); printf( "
" );
first_free( s1 );
printf( "
" );
char **s2 = second_allocate( rows, cols ); strcpy( s2[0], "first" ); strcpy( s2[1], "second" );
for ( size_t i = 0; i < rows; i++ ) printf( "%s ", s2[i] ); printf( "
" );
second_free( s2, rows );
printf( "
" );
char ( *s3 )[rows][cols] = NULL;
third_allocate( rows, cols, &s3 ); strcpy( ( *s3 )[0], "first" ); strcpy( ( *s3 )[1], "second" );
for ( size_t i = 0; i < rows; i++ ) printf( "%s ", ( *s3 )[i] ); printf( "
" );
third_free( rows, cols, s3 ); }
Вывод программы на консоль будет следующим
first second
first second
first second

wpf MVVM как изменить состояние view через viewmodel?

Логика за изменение стиля кнопки, текста и еще кучи всего находится в View.cs в отдельных методах
Но эти методы необходимо вызвать из ViewModel.
Как организовать, чтобы из ViewModel можно было вызвать метод на изменение состояния View?


Ответ

Смотрите.
Если вам нужно поменять данные, вы просто меняете их в VM, и всё, View подхватывает их через привязку.
Если вам нужно поменять визуальное состояние, то вы делаете это не в VM, а во View.
Если вам нужно поменять визуальное состояние в ответ на изменённые данные, обычно делают так: вычисление визуального состояния делают через конвертер, и применяют его.
Пример: пусть вам нужно цвет фона менять в зависимости от значения. Для значений от 1 до 3 красный, от 4 до 10 жёлтый, больше зелёный. Делаем так:
Конвертер:
class ButtonColorConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var note = (int)value; var color = note <= 3 ? Colors.Red : note <= 10 ? Colors.Yellow : Colors.Green; return new SolidColorBrush(color); }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
XAML:

Как реализовать вход по Pin-коду (отпечатку пальца)

Скажите, как можно реализовать функционал ввода пароля (PIN четырехзначный) при запуске приложения? А также сделать возможность вместо PIN использовать биометрию. Гуглил, но там только реализация в виде вызова в onRestore(), да и то, не слишком понятно


Ответ

Сканер отпечатков пальцев поддерживается Android M. Краткий алгоритм его реализации таков:
1.Прописываете разрешение:

2.Получаете экземпляр класса FingerprintManager и вызываете метод authenticate()
3.Реализовываете UI для аутентификации с помощью отпечатков пальцев, используя стандартное изображение отпечатков пальцев.
Вот мануал в официальной документации и пример

C++. Не могу расширить динамический массив в методе?

У меня получается только на 1 расширить.(и это кстати странно) Название: add:
class double_Digit { double digit; int size; double *ar; public: double_Digit() :size(NULL), ar(nullptr) { } double_Digit(int _size) :size(_size), ar(nullptr) { if (size > 0) { ar = new double[size]; } } ~double_Digit() { if (ar) { delete[]ar; } } double* add(int sizetmp) { double* arr = new double[sizetmp]; for (int i = 0; i < size; i++) { *(arr + i) = *(ar + i); } delete[]ar; double* ar = new double[sizetmp]; for (int i = 0; i < size; i++) { *(ar + i) = *(arr + i); } delete[]arr; size++; return ar; } double* GetArray() const { return ar; } int GetSize() const { return size; } };


Ответ

У вас бессмысленный метод Add, так как вы в нем пытаетесь копировать неинициализированные массивы. Вы в конструкторах в лучшем случае распределили динамически память под массив, но ничем его не инициализировали. Либо вам следует изменить конструкторы таким образом, чтобы они инициализировали массив при его создании, либо чтобы класс поддерживал число актуальных элементов в массиве.
Потом вообще не понятно, почему для размера массива используется знаковое целочисленный тип. Правильно было бы использовать тип size_t, чтобы не проверять соответствующее значение, является ли оно отрицательным или нет.
Если предположить, что массив каким-то образом инициализирован, то функция Add может выглядеть следующим образом
double * add( size_t new_size ) { if ( new_size != this->size ) { double *tmp = new double[new_size]();
size_t n = std::min( this->size, new_size );
for ( size_t i = 0; i < n; i++ ) tmp[i] = this->ar[i];
delete [] this->ar;
this->ar = tmp; this->size = new_size; }
return this->ar; }

Проблема при парсинге сайта гуггл переводчика. Jsoup

Изначально я пытался пропарсить сайт translate.ru, все было хорошо, но при парсинге translate.google.ru вылетает ошибка.
Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=https://translate.google.ru/ at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:598) at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:548) at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:235) at org.jsoup.helper.HttpConnection.get(HttpConnection.java:224) at http.RequestDemo.main(RequestDemo.java:14)
А вот вот весь код программы
import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements;
public class RequestDemo { public static void main(String[] args) throws IOException{ Document doc = Jsoup.connect("https://translate.google.ru/").get(); //System.out.println(doc.html()); Elements metaElements = doc.select("span"); //System.out.println(metaElements); } }


Ответ

Проблема решена. Для того что бы все работало надо поключаться через userAgent("/Здесь передаем название браузера/")

Как сделать лучше такой эффект(repeating-linear-gradient)?


блок высотой в 500 пикселей, данный эффект только снизу на всю ширину. Пока получилось только это https://jsfiddle.net/zdb15uun/1/

  1. repeating gradient
  2. Zebra pattern
  3. Zebra pattern 3
div { display: block; width: 50%; height: 80px; border-color: #000000; padding: 10px; }
#grad { background-image: -moz-repeating-linear- gradient(180deg,rgb(26,198,204),rgb(26,198,204) 7%, rgb(100,100,100) 10%); background-image: -webkit-repeating-linear-gradient(180deg,rgb(26,198,204),rgb(26,198,204) 7%, rgb(100,100,100) 10%); background-image: -o-repeating-linear-gradient(180deg,rgb(26,198,204),rgb(26,198,204) 7%, rgb(100,100,100) 10%); background-image: repeating-linear-gradient(180deg,rgb(26,198,204),rgb(26,198,204) 7%, rgb(100,100,100) 10%); }
#grad1 { background-image: repeating-linear-gradient(-45deg, rgba(209, 232, 220, 1), rgba(209, 232, 220, 1) 75px, rgba(212, 238, 222, 1) 10px, rgba(212, 238, 222, 1) 150px); }
#grad2 { background-color: #068445; background-image: repeating-linear-gradient(-45deg, rgba(6, 132, 69, 1), rgba(6, 132, 69, 1) 75px, rgba(27, 167, 80, 1) 10px, rgba(27, 167, 80, 1) 150px); }
не знаю, как его сделать выцветающим кверху пикселей эдак на 75


Ответ

Если градиент сверху белый, а не прозрачный, можно попробовать просто накрыть его сверху другим градиентом. Если нужна именно прозрачность, то не знаю.
html, body { height: 100%; margin: 0; } body { background-image: linear-gradient(to bottom, white, transparent), repeating-linear-gradient(-45deg, antiquewhite, antiquewhite 3em, silver 3em, silver 6em); }

Как создать вспомогательный вложенный класс от QObject в шаблонном классе?

Захотел использовать сигналы/слоты на не-QObject'овом классе. Выкидываю такой фортель:
class Receiver : public QObject { Q_OBJECT public:
public slots: void onValueChanged(int newValue) { qDebug() << "the new value is:" << newValue; } };
class Itm { public: class Buddy;
Itm();
void setValue(int newValue);
Buddy *buddy() const { return _buddy; }
private: int _value; Buddy *_buddy; Receiver *_receiver; };
class Itm::Buddy : public QObject { Q_OBJECT public: void emitValueChanged(int newValue) { emit valueChanged(newValue); }
signals: void valueChanged(int newValue); };
В cpp:
Itm::Itm() : _value(0) { _buddy = new Buddy(); _receiver = new Receiver(); QObject::connect(_buddy, &Itm::Buddy::valueChanged, _receiver, &Receiver::onValueChanged); }
void Itm::setValue(int newValue) { if (_value != newValue) { _value = newValue; _buddy->valueChanged(newValue); } }
Все нормально срабатывает.
Теперь в основном вопрос такой - как сделать тоже самое на шаблоне класса
Попытка 1:
template class Itm { template class Buddy;
...
private: ValueType _value; Buddy *_buddy; };
template class Itm::Buddy : public QObject { Q_OBJECT public: void emitValueChanged(ValueType newValue) { emit valueChanged(newValue); }
signals: void valueChanged(ValueType newValue); };
получаю ошибку:
too few template-parameter-lists
Не понятно, почему ему мало? Ладно, не буду умничать, может избегу проблем если создам nested class. Попытка 2. Описываю Buddy внутри тела класса Itm :
template class Itm { class Buddy : public QObject { Q_OBJECT public: void emitValueChanged(ValueType newValue) { emit valueChanged(newValue); }
signals: void valueChanged(ValueType newValue); };
...
private: ValueType _value; Buddy *_buddy; };
Получаю:
Meta object features not supported for nested classes
Думаю, лучше возвратиться к первому варианту, но как избежать ошибок?
Или вообще избежать шаблона и использовать QVariant?


Ответ

К сожалению так сделать не получится, потому как утилита moc не поддерживает ни шаблонные, ни вложенные классы.
Да, вы можете использовать QVariant или сделать несколько перегрузок для нужных слотов и сигналов. Перегрузку moc поддерживает.
Кроме того, сейчас можно подключать лямбда-функции в которых можно "замкнуть" указатель на объект. То есть, если вам не требуется обрабывать стандартные сигналы QObject (например destroyed) от вашего Buddy, то это вам подойдет. При этом Buddy не обязательно должен быть QObject'ом. Как-то так примерно:
template<...> class Itm { template<...> class Buddy{ ... }; };
Item<...>::Buddy<...> * buddy = ...; connect(sender, &Sender::send, [buddy](){buddy->receive();});
Вот, на хабре было интересное обсуждение по теме (читайте коментарии).

Работа с несколькими массивами в Python

Есть массивы с точками:
X[0.0, 0.0, 0.0, 0.0],Y[0.0, 0.3333, 0.6667, 1.0], kX[0.0, 0.0, 0.0],kY[0.1667, 0.5, 0.8333]
Нужно сформировать двумерные массивы R2, U и V размера(3,4), элементы которых считаются по формулам:
r2 = math.sqrt(math.pow((kX[k]-X[i]), 2) + math.pow((kY[k]-Y[i] ) , 2)) u = 1 / (2 * math.pi) * ((kY[k]-Y[i]) / math.pow(r2[k][i], 2)) v = - 1 / (2 * math.pi) * ((kX[k]-X[i]) / math.pow(r2[k][i], 2))
Поскольку я новичек, меня особенно интересует подробное описание следующего кода
###псевдокод#### r2 = math.sqrt(math.pow((kX[k]-X[i]), 2) + math.pow((kY[k]-Y[i] ) , 2)) ### реализация на питоне #### r2 = [[(cp.y - p.y)**2 + (cp.x - p.x)**2 for p in points] for cp in control_points]
где используется collections.namedtuple и вообще как обращаться к элементам массивов без использования циклов, желательно на этом примере.
Случай с точками двух массивов понятен:
u = [[1 / (2 * math.pi)*(kx - x) for x in X] for kx in kX] v = [[1 / (2 * math.pi)*(ky - y) for y in Y] for ky in kY]
А как быть, если нужно:
u = [[1 / (2 * math.pi)*(kx - x) for x in X] for kx in kX] / r2[k][i] v = [[1 / (2 * math.pi)*(ky - y) for y in Y] for ky in kY] / r2[k][i]


Ответ

Если вы хотите использовать X, Y, kX, kY как Python-списки напрямую:
import math
r2 = [[((kx - x)**2 + (ky - y)**2)**.5 for x, y in zip(X, Y)] for kx, ky in zip(kX, kY)] u = [[(kx - x) / (2 * math.pi * r2ki) for x, r2ki in zip(X, r2k)] for kx, r2k in zip(kX, r2)] v = [[(ky - y) / (2 * math.pi * r2ki) for y, r2ki in zip(Y, r2k)] for ky, r2k in zip(kY, r2)]
zip() это встроенная в Питон функция:
>>> list(zip(range(3), "abc")) [(0, 'a'), (1, 'b'), (2, 'c')]
Происхождение названия от zipper—застёжка-молния: zip() "сшивает" переданные аргументы.
Point2D (collections.namedtuple)
Если:
points = list(map(Point2D, X, Y)) control_points = list(map(Point2D, kX, kY))
тогда код для r2 идентичен уже приведённому решению (c точностью до вызова sqrt):
r2 = [[((cp.y - p.y)**2 + (cp.x - p.x)**2)**.5 for p in points] for cp in control_points]
Пример:
>>> import collections >>> Point2D = collections.namedtuple('Point2D', 'x y') >>> X, Y = [0.0, 0.0, 0.0, 0.0], [0.0, 0.3333, 0.6667, 1.0] >>> points = list(map(Point2D, X, Y)) >>> points == [Point2D(x, y) for x, y in zip(X, Y)] True >>> points [Point2D(x=0.0, y=0.0), Point2D(x=0.0, y=0.3333), Point2D(x=0.0, y=0.6667), Point2D(x=0.0, y=1.0)] >>> [p.y for p in points] [0.0, 0.3333, 0.6667, 1.0]
numpy
Eсли работать с X, Y, kX, kY как с numpy-массивами:
>>> import numpy as np >>> X, Y, kX, kY = map(np.array, [X, Y, kX, kY]) >>> r2 = ((kX[:,None] - X[None,:])**2 + (kY[:,None] - Y[None,:])**2)**.5 >>> r2 array([[ 0.1667, 0.1666, 0.5 , 0.8333], [ 0.5 , 0.1667, 0.1667, 0.5 ], [ 0.8333, 0.5 , 0.1666, 0.1667]]) >>> u = (kX[:,None] - X[None,:]) / (2 * math.pi * r2) >>> v = (kY[:,None] - Y[None,:]) / (2 * math.pi * r2) >>> v array([[ 0.15915494, -0.15915494, -0.15915494, -0.15915494], [ 0.15915494, 0.15915494, -0.15915494, -0.15915494], [ 0.15915494, 0.15915494, 0.15915494, -0.15915494]])
Здесь индексация с None добавляет новую размерность (из одномерного массива создаёт двумерный):
>>> kY array([ 0.1667, 0.5 , 0.8333]) >>> kY[:,None] array([[ 0.1667], [ 0.5 ], [ 0.8333]])

Как манипулировать с данными из option selected на jquery и ajax?

Вот ситуация, у меня уже подключено к базе данных. Я вывожу список в через функцию. Выглядит это вот так вот -

Теперь выбираем список, подгружается с базы данных.

Вот сам код части -
function fetchGenres() { $db = new Connection(); $db->open(); $genres = $db->runQuery("SELECT * FROM clubgenre"); $db->close();
$genresArr = array(); while ($row = $genres->fetch_assoc()) { $genresArr[$row["code"]] = $row["category"]; } return $genresArr; }
function showCategory($genresArr) { echo '





'; }
showCategory(fetchGenres()); ?>
Вот сам вопрос - При нажатии на кнопку делит, нужно что бы выбранная пользователем категория была удаленна с базы данных. Вот дуб дубом я. Если можно напишите часть, а если нет, то объясните поэтапно. Буду безумно благодарным, реально уже 2 дня мучаюсь, сначала что бы заработал список с базы, теперь с этим. Я даже не до конца понимаю, почему у меня это работает.


Ответ

$db = new PDO();
$genre = filter_input(INPUT_POST, 'sweets', FILTER_VALIDATE_INT);
$sth = $db->prepare("DELETE FROM clubgenre WHERE code=?;"); $sth->execute([$genre]);
Естественно решение нужно адаптировать под ваш класс работы с БД.

Qt 5.7. Компиляция IBASE плагина в Ubuntu 16.10

Необходимо собрать плагин QIBASE в Ubuntu 16.10 x64 для qt.5x. Мои действия описаны здесь.


Ответ

Сборка была проверена на Ubuntu 16.10 и Debian jessie. Под Debian команды с sudo выполнил в терминале с root Для сборки QT пользовался вики
В /etc/apt/source.list должны быть включены исходники - deb-src
sudo apt-get build-dep qt5-default sudo apt-get install libxcb-xinerama0-dev sudo apt-get install firebird-dev
Склонировал с гита и собрал QT5.7:
cd /usr/src # или любую другую папку по-усмотрению с правами на запись git clone git://code.qt.io/qt/qt5.git
cd qt5; git checkout 5.7
perl init-repository
./configure -developer-build -opensource -nomake examples -nomake tests
Конфигуратор ничего не нашёл для InterBase:
SQL drivers: DB2 .................. no InterBase ............ no MySQL ................ yes (plugin) OCI .................. no ODBC ................. yes (plugin) PostgreSQL ........... yes (plugin) SQLite 2 ............. no SQLite ............... yes (plugin, using bundled copy) TDS .................. yes (plugin)
make -j4
# make install # т.к. developers-build, нет необходимости
Собрал плагин для firebird по этому источнику
export QTDIR=/usr/src/qt5 export PATH=$QTDIR/qtbase/bin:$PATH
cd $QTDIR/qtbase/src/plugins/sqldrivers/ibase
# для обхода ошибки: /usr/bin/ld.gold: error: cannot find -lgds sudo ln -s /usr/lib/x86_64-linux-gnu/libfbclient.so /usr/lib/libgds.so
qmake "INCLUDEPATH+=/usr/include" "LIBS+=-L/usr/lib/x86_64-linux-gnu -lfbclient" ibase.pro make
Следующая ошибка уже известна и ожидает лечения баг
/usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: No such file or directory #include_next ^
Поправляем сгенерированный Makefile и повторяем make
INCPATH = -I. -isystem /usr/include --> меняем на INCPATH = -I. -I/usr/include
Вывод:
rm -f libqsqlibase.so g++ -Wl,--no-undefined -fuse-ld=gold -Wl,--enable-new-dtags -Wl,-rpath,/usr/src/qt5/qtbase/lib -shared -o libqsqlibase.so .obj/main.o .obj/qsql_ibase.o .obj/moc_qsql_ibase_p.o -L/usr/lib/x86_64-linux-gnu -lfbclient -lgds -L/usr/src/qt5/qtbase/lib -lQt5Sql -lQt5Core -lpthread mv -f libqsqlibase.so ../../../../plugins/sqldrivers/
-rwxr-xr-x 1 db src 1241008 May 1 23:55 ../../../../plugins/sqldrivers/libqsqlibase.so
Вроде всё. Собралось без особых ошибок. Тестовая программка показывает, что плагин ibase теперь доступен:
#include #include
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "drivers available:" << QSqlDatabase::drivers(); QCoreApplication::exit(0); }
drivers available: ("QIBASE", "QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7", "QTDS", "QTDS7")

T-SQL: Как распарсить такую XML

Имеем XML:
Message has been delivered
Пробую так:
select top 100 ms.[stat].value('(status/message id/text())[1]', 'varchar(50)')
Ошибка:
XQuery [dbo.Statuses.stat.value()]: Syntax error near '[', expected a step expression.
Как правильно ее распарсить?
Спасибо


Ответ

Атрибуты запрашиваются так [stat].value('(/status/message/@id)[1]', 'char(10)')
Текст запрашивается так [stat].value('(/status/state/text())[1]', 'varchar(50)')
Пару слов о типах. Если varchar(n) - вернёт "правильную строку". char(n) - дополнит недостающие символы пробелами. Если int то в случае ошибки конвертирование в число - даст ошибку.
Как на mssql проверить быстро:
select [stat].query('/status/message'), [stat].value('(/status/state/text())[1]', 'varchar(50)') from (select cast( ' Message has been delivered ' as xml) stat) t
Вариант проще
declare @x xml set @x = '1' select @x.value('(/a/text())[1]','int')
Если хотите запросить ветку - использовать [stat].query('/status/message')
Полезные ссылки so-En msdn-примеры

Как получить столкновение объектов в игре?

Есть класс в библиотеке LIBGDX для проверки столкновений
import com.badlogic.gdx.math.Intersector; Intersector.intersectRectangles(rectangle1, rectangle2, intersection);
Как реализовать его не понимаю. У меня имеются два класса Bullet и Enemy у них имеются свои координаты Rectangles.
К примеру, пуля летит по горизонтали и нужно сделать проверку на столкновение. В гугле искал код реализации, вроде находил что то похожее, но как то не получается реализовать это в коде.
Кто сталкивался с подобным классом столкновений? Подскажите, куда смотреть.
Пытаюсь написать условие с циклом for но выдает ошибку в r2:
java.lang.IndexOutOfBoundsException: index can't be >= size: 1 >= 1
Вот код, который я пытаюсь выполнить:
if(arrayBullet.size != 0){ Rectangle intersection = new Rectangle(); for(int k=0;knum — переменная объявлена в поле класса для быстрого доступа в циклах for который находится в методе render


Ответ

Все разобрался... невнимательность дает о себе знать... Всего лишь поменял буковку в r2 на букву k :)))
if(arrayBullet.size != 0){ Rectangle intersection = new Rectangle(); for(int k=0;k

Нужен совет по необычному SQL-запросу из PHP

В таблице БД apartments площадь квартиры хранится в строке square по следующему шаблону: *«общая-жилая-кухня». Таким образом, это выглядит как 32-28-6
Теперь стоит вопрос: как сформировать SQL-запрос, если нужно вывести только общую площадь не менее нужного значения? Я понимаю, что задача не простая, но база уже наполнена объявлениями, и в систему поиска предстоит добавить только этот функционал, не нарушая работы остальных участков кода проекта.
До какого-то момента я использовал ошибочный запрос (но это не вариант):
SELECT * FROM apartments WHERE square LIKE '30-%'
Средства PHP задействовать можно, но здесь в самом запросе идет уже деление на страницы через LIMIT. Таким образом, если после получения результатов поиска мы будем отбирать «нужные» по площади квартиры, то у нас на одной странице получится 10 записей, а на другой меньше или вообще ничего.
Ребята, большое ВАМ спасибо за оперативное решение сложного для меня вопроса! Особенно благодарен пользователям cache и Akina - ваше решение успешно работает!


Ответ

SELECT * FROM apartments WHERE 0+SUBSTRING_INDEX(square,'-',1) >= 30;

Rails: scope из модели в self

Я получаю фильтр фильмов путем присваивания @movies нового значения, но я хотел бы чтобы возвращало в self и кусок кода @movies = @movies.filter_ratings(params[:ratings]) стал красивым: @movies.filter_ratings(params[:ratings])
Рою гугл 2 день, помогите пожалуйста!
Мой контроллер:
class MoviesController < ApplicationController def index @movies = Movie.sort_by(params[:sort_by]) @movies = @movies.filter_ratings(params[:ratings]) unless (params[:ratings]).nil? end end
Моя модель:
class Movie < ActiveRecord::Base # сортируем по требуемому полю scope :sort_by, ->(sorting) { all.order(sorting) } # выводим список рейтингов scope :all_ratings, -> { all.map{|movie| movie.rating }.uniq } # получаем фильмы согласно фильтру пользователя scope :filter_ratings, ->(filters) { where(:rating => filters.each_key.to_a) } end


Ответ

В ActiveRecord нет методов (публичных как минимум), меняющих уже созданный Relation
Так задумано (см. комментарии к этому коммиту в Rails). API построителя запросов задуман, как иммутабельный, чтобы он был более предсказуемым, не вызывал неожиданного поведения где-то, где это не указано явно.
Но я не вижу ни единой причины, по которой unless (params[:ratings]).nil? нельзя проверять в самом скоупе, возвращая self, если изменения не требуются:
scope :filter_ratings, ->(filters) { if filters.nil? self else where(:rating => filters.each_key.to_a) end }
Тогда сделать описанный вами запрос можно с помощью более длинной цепочки:
@movies = Movie.sort_by(params[:sort_by]).filter_ratings(params[:ratings])
Переносы/отступы по вкусу.

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

Пол часа мучался с OpenDKIM(пакет именнуется в нижнем регистре) с репозитория Debian sid Он не в какую не хотел слушать свой дефолтный tcp порт, указывал его в конфиге, а он всё ровно слушает unix сокет. В htop я заметил что демон запускается с опцией -p local:/var/run/opendkim/opendkim.sock, я заглянул в его systemd юнит и действительно обнаружил там в ExecStart опцию -p local:/var/run/opendkim/opendkim.sock, как не сложно догадатся эта опция указует что слушать нужно указанный unix сокет, мне это кажется не правильным, это ломает совместимость со старыми версиями и не соответствует даже инструкции на wiki.debian.org, инструкция уж не как не древняя я считаю https://wiki.debian.org/opendkim В связи с эти есть несколько вопросов: 1. Куда обратится? В описании пакета есть email мейнтейнера, нужно ему на email писать? 2. Есть ли где описание каждого изменения в пакете, то есть могу ли я найти комментарий обьясняющий для чего был добавлен этот аргумент в unit скрипт? 3. Стоит ли сообщать о этом "баге"? Ведь добавлял этот аргумент наверняка лучше разберающийся человек чем я и мне не хотелось бы с ним спорить, а темболее через google translate


Ответ

Как оказалось я ошибся на счет бага, там unit генерируется динамически и слушающий сокет считуется с /etc/default/opendkim, у меня почему-то не считался и сгенерировался unit с дефолтным unix сокетом, а с файла конфигурации сокет вообще не должен считыватся, точнее он перекрывается передачей опции -p <сокет считаный с файла /etc/default/opendkim>, после полной переустановки пакета всё наладилось.
А теперь последовательность действий которую я бы посоветовал желающим отправить багрепорт касающийся какого либо пакета: 1. Попробуйте для начала переустановить полностю пакет и проверить воспроизводится ли баг после этого. 2. Проверте тщательно, действительно ли это баг, а не вы не правильно что-то делаете. 3. Проанализируйте баг чтоб можно было его нормально описать. 4. Ознакомтесь с информацией по данной ссылке https://wiki.debian.org/reportbug (Спасибо @alexander barakin ). 5. Установите пакет reportbug, введите reportbug <имя пакета с багом> и следуйте дальнейшим инструкциям.

С#. Получить handle, присвоенный процессу операционной системой при запуске, средствами WinAPI

Доброго времени суток.
Возник такой вопрос. Класс System.Diagnostics.Process возвращает дескриптор процесса, присвоенный ему ОС при запуске. И вот что-то никак не могу найти способ получить его с помощью WinAPI. OpenProcess - возвращает, конечно, дескриптор, но, насколько понимаю, уже "свой",а не тот, который был присвоен при запуске программы.


Ответ

Проще всего подсмотреть в исходники. Есть замечательный сайт http://sourceof.net. Для вновь созданных процессов processId приходит из CreateProcess. Для GetProcesses сложнее. Находим метод Process.GetProcesses, идём по ссылкам, и видим, что вся работа делается здесь через PERF_COUNTER

Хэндл — да, он каждый раз свой. Хэндл по сути просто указатель на какую-то внутреннюю структуру данных, описывающую процесс. А вот processId должен быть один и тот же всегда.

Winforms. Отобразить на графике разрешенные значения

Здравствуйте,
Поставил в форме график синуса и так же пытаюсь показать разрешенную площадь значений. Надо вывести на графике что-то похожее на серый прямоугольник (см. рис. 1) . Он не обязательно начинается с Y=0 Точки синуса приходят во время работы програмы одна за одной. Пытался использовать StripLine - очень похоже на то, что мне надо (см. рис. 2, желтоватая и голубоватая зоны), но у меня не получается определить его начальное значение как точку, в которой две координаты не равны 0. Так же его продолжительность должна быть не бесконечной. (В отличие от рис. 2)
рис. 1
рис. 2


Ответ

Благодаря одному из участников английского Stackoverflow, вот он ответ (точнее, работающий код) :
void drawAllowedArea(Point startPoint, Point endPoint, PaintEventArgs e) { var l = (float)chart1.ChartAreas[0].AxisX.ValueToPixelPosition(startPoint.X); var t = (float)chart1.ChartAreas[0].AxisY.ValueToPixelPosition(endPoint.Y); var r = (float)chart1.ChartAreas[0].AxisX.ValueToPixelPosition(endPoint.X); var b = (float)chart1.ChartAreas[0].AxisY.ValueToPixelPosition(startPoint.Y); var rect = RectangleF.FromLTRB(l, t, r, b); using (var br = new SolidBrush(Color.FromArgb(100, Color.Blue))) { e.Graphics.FillRectangle(br, rect.X, rect.Y, rect.Width, rect.Height); } e.Graphics.DrawRectangle(Pens.Red, rect.X, rect.Y, rect.Width, rect.Height); }
//and use this function in chart1_Paint event: void chart1_Paint(object sender, PaintEventArgs e) { drawAllowedArea(new Point(20, 50000), new Point(40, 100000), e); }
Ссылка на мой вопрос: https://stackoverflow.com/questions/41263864/winforms-chart-draw-a-allowed-area-on-line-chart
Спасибо всем, кто думал как мне помочь! :)

Как менять регистр английских букв в Visual Studio с помощью регулярных выражений?

Рефакторю большой проект с помощью Visual Studio Find and Replace и не получается менять регистр с помощью регулярных выражений. Интересны только большие английские буквы. Нужно заменить UPPERCASE на TitleCase внутри определённых символов. Например, нужно заменить USER NAME на User Name


Ответ

Предлагаю решение, основанное на возможностях Notepad++. В окне "Найти в файлах" выберите необходимый путь к папке с файлами, задайте маску и используйте следующие значения для двух полей:
Найти:            (?:\G(?!^)|)\s*[^<\s]\K[^<\s]* Заменить на: \L$&
Подробности
(?:\G(?!^)|) - найти , а все последующие совпадения должны начинаться с того места, где закончилось предыдущее \s* - 0+ пробельных символов [^<\s] - 1 символ, отличный от < и пробельного символа \K - оператор, удаляющий весь текст из текущего совпадения [^<\s]* - 0 и более символов, отличных от < и пробельного символа
Шаблон замены:
\L - оператор замены символов на строчные $& - во всем найденном совпадении
Примечание. Опцию и новые строки задавать необязательно. Во всех подпапках обработает файлы с заданной маской во всех подпапках.

Статический конструктор структуры и инициализация синглтона

Вопрос на основе двух статей:
О синглтонах и статических конструкторах Реализация синглтонов в .NET: Field-like vs. Lazy
Собственно, вспомнил, что у структур несколько иначе обстоят дела с вызовом статического конструктора (он вызывается перед обращением к статическому полю, но не вызывается при создании инстанса структуры). Соответственно, возникло желание поместить свойство Instance внутрь структуры. Сначала я хотел что-то намудрить с красотой обращения к нему, но потом передумал и решил спросить по самому концепту - даёт ли это что-то помимо ленивой инициализации (кстати, а действительно ли она тут гарантирована) и есть ли какие-то побочные эффекты?.
http://ideone.com/BrgjAI
using System;
struct FieldLikeSingletonWrapper { public class FieldLikeSingleton { internal FieldLikeSingleton() { Console.WriteLine("FieldLikeSingleton.ctor"); }
public void Foo() { Console.WriteLine("Foo"); } }
public static FieldLikeSingleton Instance { get; } = new FieldLikeSingleton(); }
class Program { static void Main(string[] args) { Console.WriteLine("Inside Main()");
if (args.Length == 42) { FieldLikeSingletonWrapper.Instance.Foo(); } } }
Кстати, сначала мне казалось очевидным, что сделать сам синглтон структурой - идея ужасная, поскольку структура будет копироваться. Но потом я подумал, что можно объявить прокинуть методы через структуру (да, это минус), но использовать скрытый вложенный класс:
http://ideone.com/Ok1XP0
using System;
struct FieldLikeSingleton { private class FieldLikeSingletonImpl { internal FieldLikeSingletonImpl() { Console.WriteLine("FieldLikeSingleton.ctor"); }
public void Foo() { Console.WriteLine("Foo"); } }
private static FieldLikeSingletonImpl instance = new FieldLikeSingletonImpl(); public static FieldLikeSingleton Instance { get; }
public void Foo() { instance.Foo(); } }
class Program { static void Main(string[] args) { Console.WriteLine("Inside Main()");
if (args.Length == 42) { FieldLikeSingleton.Instance.Foo(); } } }
Какие плюсы и минусы есть у этих подходов по сравнению с обычным field-like?


Ответ

вспомнил, что у структур несколько иначе обстоят дела с вызовом статического конструктора (он вызывается перед обращением к статическому полю, но не вызывается при создании инстанса структуры).
Это не совсем так. Точнее, это так, если считать, что default(T) - это единственный способ создания экземпляра структуры. Да, в случае var x = new FooStruct() статический конструктор не вызывается, поскольку в этом случае происходит просто выделение и обнуление блока памяти. Если бы в этом случае была проверка инициализации типа, то это привело бы к существенным накладным расходам во время исполнения (а ведь структуры предназначены именно для таких low-level сценариев, где каждый такт имеет значение).
Аналогично, при копировании структуры статический конструктор не будет вызван:
var @default = new FooStruct(); // нет вызова статического конструктора var copy = @default; // нет вызова статического конструктора
Однако при вызове пользовательского конструктора структуры, статический конструктор будет вызван (это же будет справедливым и для пользовательского конструктора по-умолчанию; его нельзя создать в C#, но если создадите, то статический конструктор будет вызываться и для var x = new FooStruct()):
var instance = new FooStruct(42);
Вообще, тут нужно понять, какую именно проблему вы хотите решить.
Если вопрос с ленивостью инициализации синглтона, то наличие поля Instance во вложенном классе сделает поведение полностью ленивым:
class SomeSingleton { private class SingletonHolder { public static readonly SomeSingleton Instance = new SomeSingleton(); }
public static SomeSingleton Instance => SingletonHolder.Instance; }
В этом случае обращение к статическим членам класса SomeSingleton не приведет к инициализации синглтона. Единственный способ инициализации синглтона - обращение к свойству Instance
Подчеркну: это решение полностью ленивое, но оно страдает остальными проблемами field-like синглтонов, связанных с исключениями.
P.S. Ну и все танцы с бубном по делегированию структуре - вещь просто избыточная: она серьезно усложняет сопровождение без каких-либо выгод с точки зрения времени исполнения.

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

У меня есть простая программа, которую я хочу отладить:
class Program { static void MyWrite() { System.Console.WriteLine("TEST!!!!!"); } static void Main(string[] args) { System.Console.WriteLine("PRE"); MyWrite(); System.Console.WriteLine("POST"); } }
Допустим, я хочу поставить точку остановки в начало исполнения MyWrite используя Windbg. Для этого я выполняю следующие шаги:
Открываю windbg Открываю ConsoleApplication1.exe файл Выполняю команду sxe ld:clr Выполняю команду g Выполняю команду .loadby sos clr Выполняю команду !bpmd ConsoleApplication1.exe ConsoleApplication1.Program.MyWrite
Последняя команда фейлится с сообщением
c0000005 Exception in C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.bpmd debugger extension. PC: 0a13b780 VA: 00000000 R/W: 0 Parameter: 00000000
Не понимаю, в чем ошибка.


Ответ

Для работы !bpmd нужен clrjit, а на момент загрузки clr его скорее всего нет. .loadby sos clr может глючить - криво загружать sos. Помогает .unload и еще один .loadby sos clr. Но указание прямого пути надежнее. У вас класс объявлен без namespace (т.е. он просто Program, а не ConsoleApplication1.Program, а брекпойнт вы пытаетесь ставить так, как будто бы namespace у вас есть). Может быть на самом деле и есть, просто вы код не весь привели.
Рабочая последовательность:
sxe ld:clrjit g .load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll !bpmd ConsoleApplication1.exe Program.MyWrite()
.exe и () в последней строке опциональны, без них тоже должно работать.
Вывод должен выглядеть вот так:
0:000> !bpmd ConsoleApplication1.exe Program.MyWrite() Found 1 methods in module 00f03fdc... MethodDesc = 00f04d04 Adding pending breakpoints...
Если пишет просто
Adding pending breakpoints...
...значит вы не угадали с именем сборки, класса или метода.

Как определить началась ли новая строка в textarea ? с помощью JQ

Добрый день, мне нужно увеличивать rows в textarea и увеличивать высоту самого блока вверх, если началась новая строка (как в Skype). Можно ли проверить началась ли новая строка с помощью JQ? Спасибо.


Ответ

Нашел ответ на свой вопрос. Может быть кому пригодится: проверяю area.scrollTop(), если он вырос тогда увеличиваю rows и размер самого блока. Всем спасибо

Почему блок с overflow: hidden встаёт рядом?

Если у блока выставлено overflow: hidden, он встаёт рядом с float'ом, а не накрывается им. Почему так? И как вообще overflow взаимодействует с размещением блоков?
section { margin: 1em 0; border: 4px solid burlywood; } section:after { content: ''; display: block; clear: both; } aside { float: left; width: 5em; background: rgba(160, 160, 160, .5); border: 4px dotted red; } div { border: 4px solid blue; }

2
2


Ответ

Правила обтекания для float применяются внутри одного блочного контекста форматирования. Блочные элементы, у которых overflow имеет значение отличное от visible получают новый блочный контекст форматирования.
Почему это важно, можно увидеть в статье "MDN: overflow".
Это технически необходимо, поскольку если бы float пересекался с элементом прокрутки, это потребовало бы обеспечить обтекание содержимого прокручиваемого элемента вокруг вторгающихся float'ов. Обтекание при этом было бы необходимо производить после каждого шага прокрутки заново, что привело бы к заметному замедлению прокрутки.
Кроме того, блочный контекст форматирования может быть создан посредством:
корневого элемента или чего-то, что содержит его поплавков (элементы, у которых float не равно none) абсолютно позиционированных элементов (элементами, значение position которых либо absolute, либо fixed) строчных блоков (элементы с display: inline-block) ячеек таблиц (элементы с display: table-cell, установленным по умолчанию для ячеек таблицы) заголовков таблиц (элементы с display: table-caption, установленным по умолчанию для заголовков таблицы) элементов, у которых значение свойства overflow отличается от visible flex блоков (элементы с display: flex или inline-flex)

Не могу зафиксировать шапку

Есть страница
Есть шапка с такой версткой


style
.fixed_header { position: fixed; top: 0; left: 0; width: 100%; z-index: 9999; /* Любое положительное значение */ }
Но контентная часть не хочет идти после шапки. В чем проблема?


Ответ

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


.header { height: 217px; /* Высота вашего фиксированного хедера */ }
Также можно непосредственно самой контентной части задать смещение через margin, однако первый вариант более верный, потому что рассчитан на то, что хедера может вообще не быть или он может изменяться.