Страницы

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

вторник, 6 ноября 2018 г.

Как загрузить вторую форму в фоновом режиме?

Как при открытии приложения, загрузить форму Form2 в фоновом режиме, при условии, что сначала загружается FormMain (основная форма, при открытии приложения)?
При нажатии на pictureBox открывается Form2 внутри panelMain, но на ее открытие тратится около двух секунд, т.к. на Form2 много ресурсов.


Ответ

Я задавался похожим вопросом и нашёл ответ. Поэтому рекомендую метод расширения
public static class FormHelper { public static void ShowInvisible(this Form form) { // сохраняем параметры окна bool needToShowInTaskbar = form.ShowInTaskbar; FormWindowState initialWindowState = form.WindowState;
// делаем окно невидимым form.ShowInTaskbar = false; form.WindowState = FormWindowState.Minimized;
// показываем и скрываем окно form.Show(); form.Hide();
// восстанавливаем параметры окна form.ShowInTaskbar = needToShowInTaskbar; form.WindowState = initialWindowState; } }
Затем в констукторе MainForm и при клике на pictureBox
public class MainForm { private readonly Form2 _form2 = new Form2();
public MainForm() { InitializeComponent();
_form2.ShowInvisible(); }
private void PictureBox_Click(object sender, EventArgs e) { _form2.Show(); } }

В Ubuntu создание большого файла командой dd принудительно завершается - “Killed”

Уважаемые коллеги, я столкнулся с такой странностью. В виртуальной машине 2Gb ram, 25Gb диск, 1 ядро запущена Ubuntu 16.04 и установлен GitLab
Чтобы исключить потерю данных за большое время, я ночью выключаю виртуалку и архивирую образ диска целиком.
И я вижу, что архивы какие то большие получаются. (больше, чем показывает команда df как использованный объем диска) "Ага!" - подумал я. Значит, на диске есть какие то данные, которые лежат на неиспользованной области, дай ка я заполню ее нулями.
Решаю создать один большой заполненный нулями файл при помощи команды
sudo dd if=/dev/zero of=file0 bs=1G count=18
Объем файла совершенно точно меньше свободного места на диске.
Но сколько я ни пробовал - команда ни разу команда не доработала до конца, где то в процессе появляется надпись "Killed", и ее выполнение прекращается.
Смотрите скриншот.
Я подозреваю, что где то в убунте есть монитор, который отстреливает процессы, которые жрут слишком много ресурсов (думаю, в моём случае - памяти он много жрет).
Но где про это прочитать?
Особенно - про настройку системы, чтобы она была более терпимой к превышению памяти и просто позволяла процессу уйти в своп. Это актуально и для других процессов, не только dd
Спасибо.


Ответ

Возможно dd попало под OOMkiller. http://shtsh.blogspot.com/2012/04/oom-killer.html

Частичная специализация C++

Почему этот пример считается частичной специализацией:
template class A { };
template class A { };
Ведь в нем не идет замена параметров шаблона конкретными типами или константными выражениями?


Ответ

Специализация которая начинается с template называется "частичной", специализация которая начинается с template<> называется "полной".

Почему может не работать метод “split”?

Применяю так:
String s = "01.02.2003"; String[] arr = s.split("."); Log.i("MyLog", "arr.length: " + arr.length);
Результат:
arr.length: 0;
Проверяю:
if (s.contains(".")) Log.i("MyLog", "true"); else Log.i("MyLog", "false");
Результат:
true


Ответ

Символ используется в регулярных выражениях для обозначения любого символа
Поэтому нужно этот символ экранировать: s.split("\\.")

Spring и парсинг сайтов

Можно ли применить Spring для чтения данных с других сайтов?


Ответ

Не надо замарачиваться и искать тулзы в Spring для этого есть удобный инструмент,JSoup. Примеры
Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); Elements newsHeadlines = doc.select("#mp-itn b a");
Или же если ты хочешь body:
Elements body = doc.select("body");
Или если ты хочешь все <а> тэги:
Elements links = doc.select("body a");
Source

Уточнение по поводу posix_threads в linux

Хотел разобраться что за легковесные потоки, в итоге полнейшая каша в голове стала еще гуще... читал тут книгу У. Ричард Стивенс, Стивен А. Раго "UNIX. Профессиональное программирование", там был кусок:
pthread_t ntid; void printids(const char *s) { pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)
", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid); } void* thr_fn(void *arg) { printids("новый поток: "); return((void *)0); } int main(void) { int err; err = pthread_create(&ntid, NULL, thr_fn, NULL); if (err != 0) err_quit("невозможно создать поток: %s
", strerror(err)); printids("главный поток:"); sleep(1); exit(0); }
И в linux это выводило следующее:
$ ./a.out новый поток: pid 6628 tid 1026 (0x402) главный поток: pid 6626 tid 1024 (0x400)
Т.е. для каждого потока process id разные из-за того что при pthread_create используется системный вызов clone() типа это тоже своеобразный процесс... И в итоге теперь не понятно: есть ли вообще в линуксе нити в общепринятом представлении, т.е. у нитей общее адресное пространство, но свой стек, у процессов разные адресные пространства.
Гугление очень запутало: где-то говорится, что posix threads в линуксе работают лишь в пространстве ядра, где-то, что в пользовательском пространстве, где-то, что и там и там. Я считал что в и там и там исполняются лишь процессы.
Посему вопросы:
нативный тред в линуксе исполняется в пространстве пользователя или в пространстве ядра? есть ли вообще нативный тред в линуксе и является ли он легковесным процессом


Ответ

Да, есть native threads как результат вызова clone(), и они (в реализации pthread) исполняются в пространстве пользователя, являясь легковесными процессами (по крайней мере в том смысле, что кванты времени CPU им выделяются тем же планировщиком ядра, что и остальным процессам).
У каждого такого потока свой стек (в общем адресном пространстве), маска сигналов, переменная errno (и м.б. еще несколько ресурсов, см. подробнее в pthreads(7) - Linux man page).

В чём отличия и сходства паттернов Adapter, Decorator, Wrapper и Proxy?

Здравствуйте. Разбираюсь понемного с паттернами проектирования, и не могу понять разницу в данных паттернах. В некоторых местах их считают синонимами. Отличия адаптера и декоратора я вроде бы нашёл (как я понял первый реализует интерфейс отличный, от интерфейса оборачиваемого объекта; а второй реализует тот же интерфейс, что и оборачиваемый объект). Но вот чем отличается адаптер от раппера (обёртки) найти не могу. Также не понятно, чем прокси отличается от декоратора. PS Желательны примеры кода, чтобы сразу увидеть отличия и сходства.


Ответ

Сперва маленькое уточнение: Wrapper -- это синоним декоратора. Т.о. речь в вопросе на самом деле идет о трех шаблонах: декоратор, адаптер и заместитель.

Все эти шаблоны схожи тем, что создают некоторую "обертку" вокруг класса. Так что ваши слова во многом справедливы:
ощущение, что это буквально один нож, которым кто-то режет хлеб, а кто-то строгает дерево, а кто-то - ещё как-то применяет его
Однако различаются они тем, какой интерфейс предоставляют и что делают с функциональностью оригинального класса (читай, внешний вид и предназначение ножа).
Заместитель (proxy) оборачивает некоторый класс и предоставляет такой же интерфейс. Цель -- "притвориться" оригинальным классом и скрыть от клиента детали. Типичные примеры использования -- ленивая инициализация оборачиваемого класса или оборачивание вызовов стороннего сервиса.
Декоратор также оборачивает некоторый класс и предоставляет такой же или расширенный интерфейс. Иногда декоратор называют "умным заместителем" (smart proxy). Т.е. декоратор может притворяться оригинальным классом и при этом расширять его функциональность. Пример: у вас есть заместитель, который прячет вызовы к стороннему сервису. Можно создать декоратор, который будет оборачивать и кэшировать результаты вызовов. Другой пример: нужно расширить функциональность оригинального класса, но он закрыт для наследования. Создается декоратор, который расширяет интерфейс оригинального класса.
Адаптер также оборачивает некоторый класс, но при этом предоставляет другой интерфейс. Т.е. используется в случаях, когда есть класс с нужными данными и поведением, но с неподходящим интерфейсом.
Итого:
--------------------------------------------------------------------------- | Шаблон | Что делает с интерфейсом | Что делает с функциональностью | --------------------------------------------------------------------------- | Заместитель | Не изменяет | Не изменяет | --------------------------------------------------------------------------- | Декоратор | Не изменяет/расширяет | Расширяет | --------------------------------------------------------------------------- | Адаптер | Изменяет | Не изменяет | ---------------------------------------------------------------------------

Что касается того, как они выглядят на уровне кода. Реализации, само собой, могут варьироваться, поэтому чтобы определить, что есть что, пользуйтесь следующими шагами:
Определите оригинальный объект/класс. Посмотрите, какой интерфейс предоставляет обертка. Посмотрите, какую функциональность предоставляет обертка.

Конструктор классов

Например есть такой класс(к примеру)
public class Person { public int Age { get; set; } public string Name { get; set; }
public Person() { Age = 10; Name = "Nick"; } }
Вот мне что интересно я когда начал изучать программирование мне говорили что для конструктора класса не используется понятие возвращаемый тип,по той причине что конструктор работает всякий раз когда создается объект этого класса и поскольку тип объекта эта тип класса тогда нету смысла для конструктора написать тип возвращаемого значения(или я что не так понял?),и мне это не так и интересовал и я не стал искать ответов. Но не давно начал изучать книгу Рихтера(CLR via C#) и при просмотре IL кода увидел вот такое
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 8 (0x8) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: nop IL_0007: ret } // end of method Program::.ctor
Если я не ошибаюсь эта "instance void" часть значит что у конструктора привязан возвращаемый тип void Как это объяснить?


Ответ

Возвращаемый тип void, это разве не отсутсвие возвращаемого значения? Конструктор в .NET вызывается как метод класса. В вашем примере выше вызывается базовый конструктор типа System.Object:
ldarg.0
Загружается первый аргумент метода в стек. Все нестатические методы неявно имеют первый параметр - указатель на экземпляр объекта
call instance void [mscorlib]System.Object::.ctor()
Вызывает контруктор System.Object на экземпляре вашего класса. Как аргумент передан указатель на экземпляр вашего класса.

Как последовательно вызвать асинхронную функцию с коллбеками?

Есть массив, для каждого элемента которого следует вызвать асинхронную функцию, возвращающую значение через коллбэк.
Однако, требуется вызвать их последовательно, а именно, следующий вызов надо совершать только тогда, когда завершилась обработка предыдущего.
Вот так получается одновременно:
function doSmth(x, callback) { setTimeout(callback, Math.random() * 100 | 0, null, x); } var data = [1, 2, 3, 4, 5, 6, 7, 8]; for (var x of data) { doSmth(x, function (err, res) { console.log(err || res); }); } .as-console-wrapper.as-console-wrapper { max-height: 100vh }


Ответ

Надо делать вызов внутри коллбека. Для этого придётся переписать цикл на рекурсию (ну или не совсем рекурсию):
function doSmth(x, callback) { setTimeout(callback, Math.random() * 100 | 0, null, x); } var data = [1, 2, 3, 4, 5, 6, 7, 8]; (function go(i) { // <================== рекурсивная функция вместо цикла if (i >= data.length) { return; // <======================== выход, когда массив закончился } doSmth(data[i], function (err, res) { console.log(err || res); go(i + 1); // <===================== рекурсивный вызов из коллбэка }); })(0); .as-console-wrapper.as-console-wrapper { max-height: 100vh }
И остаётся ещё один момент - обычно нам бы надо узнать, когда завершилась обработка. Для этого функция go вместо return может вызвать другой коллбэк из вызывающей функции:
function doSmth(x, callback) { setTimeout(callback, Math.random() * 100 | 0, null, x); } function process(data, callback) { (function go(i) { // <================== рекурсивная функция вместо цикла if (i >= data.length) { return callback(null, null); // <=== return позволяет избежать рекурсивного вызова } doSmth(data[i], function (err, res) { if (err) { return callback(err, null); // <== прекращаем дальнейшую обработку } console.log(res); go(i + 1); // <===================== рекурсивный вызов из коллбэка }); })(0); } var data = [1, 2, 3, 4, 5, 6, 7, 8]; process(data, function (err, res) { console.log(err || "Готово!"); }); .as-console-wrapper.as-console-wrapper { max-height: 100vh }

std::cout не выводит данные в консоль

У меня есть код, который выводит в консоль некоторый текст:
int main() { std::cout << "Hello, world!";
// Обеспечим некоторую задержку, не давая приложению завершиться pause();
return 0; }
Однако текст не выводится, пока приложение не завершится штатным образом (в данном случае при сигнале).
В чём дело?


Ответ

Вы столкнулись с таким явлением, как буферизация потоков ввода-вывода.
Дело в том, что в C++ потоки std::istream и std::ostream (и, сответственно, их потомки) — это всего лишь обёртки над побайтовым буфером std::streambuf. Сам же std::streambuf содержит в себе два кэша — один для чтения, другой для записи, — в виде массивов, описываемых границами и курсором (то есть текущей позицией):

Источник: Frank B. Brokken. C++ Annotations Version 10.8.1. Chapter 14: Polymorphism
При любой работе с данными класс буфера сначала пытается сделать всё в рамках этого кэша. И только если это не является возможным (переполнился буфер записи, либо исчерпался буфер чтения), он обращается к своему дочернему классу-реализации конкретного буфера и просит либо опустошить буфер записи, либо загрузить новые данные для чтения (через вызов чисто виртуальных методов overflow() и underflow() соответственно).
В вашем случае очистка кэша срабатывала исключительно при уничтожении std::streambuf, ассоциированного со стандартным потоком вывода (так как длина записанной строки была недостаточной для переполнения кэша). Соответственно, для немедленного вывода данных необходимо сбросить буфер записи вручную, вызовом метода std::ostream::flush(). Кстати, этот метод неявно вызывается при использовании std::endl

Редактировать стили одного слова как отдельной части текста

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


Ответ

Используйте обёртку к слову. Тег закрывайте, как

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

Необходимо добиться следующего эффекта: http://gph.is/2iZZ3Hw - рисования контуров и затем заполнение цветом. Для определения общей длины путей может понадобиться JS.
Ниже код

Источник : Animate SVG with CSS: first the stroke, then the fill


Ответ


Из примера видно, что нужно анимировать строки трёх объектов логотипа: круга, трапеции и треугольника, затем заполнить цветом трапецию и треугольник.
Для анимации строк определяем их длину с помощью JS

Найденная длина для:
окружности - 138px
трапеции - 60px
треугольника - 35px
Команды для анимации рисования строк



Анимация рисования треугольника начнется, когда закончится анимация рисования трапеции
begin="an_trap.end"
Анимация закрашивания трапеции начнется, когда закончится анимация рисования окружности
Анимация заполнение цветом треугольника начнется, когда закончится анимация заполнения цветом трапеции

UPD Поддержка всеми современными браузерами кроме IE, Edge https://caniuse.com/#search=svg%20smil

Когда можно использовать recyclerView.setHasFixedSize(true)?

Javadocs говорит, что использовать recyclerView.setHasFixedSize(true) можно в случае, если заранее известно, что размер содержимого RecyclerView не зависит от содержимого адаптера. А что именно это значит? Что использовать recyclerView.setHasFixedSize(true) можно, когда не изменяется размер одного элемента (высота, ширина)? Т.е. когда все элементы recyclerView имеют одинаковые размеры? Или же это означает что-то другое?


Ответ

recyclerView.setHasFixedSize(true) используется, когда размер элементов списка одинаковый (высота/ширина).
Это дает определенный выигрыш в скорости разворачивания списка, в частности, как пишет документация:
RecyclerView can perform several optimizations if it can know in advance that changes in adapter content cannot change the size of the RecyclerView itself. If your use of RecyclerView falls into this category, set this to true.
Грубый перевод:
RecyclerView может оптимизировать некоторые операции, если ему известно заранее, что изменения в контенте адаптера не могут изменить размера самого RecyclerView. Если ваш вариант использования RecyclerView подпадает в эту категорию, установите его в true
P.S. Учите английский.

Переход по меткам в коде?

В 1с была такая фитча нажимаешь комбинацию клавиш и там где находится в коде курсор ставится метка, далее программируешь ставишь другую метку и по нажатии комбинации клавиш в коде можно перемещаться по этим меткам. Есть что то подобное в Android Studio?


Ответ

Меню Navigate -> Bookmarks
или
F11 - поставить\снять метку. Shift + F11 - вывести список меток и перейти к нужной. Ctrl + F11 - поставить метку с мнемоникой\снять метку
Так же есть переход к предыдущей\следующей метке, но горячие клавиши по умолчанию за этими действиями не закреплены (доступны только из меню) - их можно назначить самому

Анимированный border css

.simple__button { margin-top: -9px; display: inline-block; padding: 0px 5px; background: #000; border-radius: 10px; height: 47px; min-width: 107px; text-align: center; } .sb__ { color: #fff; cursor: pointer; margin-top: 3px; font-size: 17px; padding: 7px 16px; text-transform: uppercase; text-align: center; border: 2px dashed #89cac0; height: 22px; min-width: 105px; display: inline-block; border-radius: 7px; }

Это текст!

Как реализовать анимированный "бегающий" border. Как сделать чтобы этот border двигался по кругу(прямоугольнику)?


Ответ

Держи через animation
@keyframes marching-ants { 0% { background-position: 0 0, 10px 100%, 0 10px, 100% 0; } 100% { background-position: 10px 0, 0 100%, 0 0, 100% 10px; } } .simple__button { display: inline-block; padding: 0px 5px; background: #000; border-radius: 10px; height: 47px; min-width: 107px; } .sb__ { color: #fff; cursor: pointer; margin-top: 6px; font-size: 17px; padding: 7px 16px; text-transform: uppercase; text-align: center; height: 22px; min-width: 105px; display: inline-block; border-radius: 7px; background-image: linear-gradient(90deg, #89cac0 50%, transparent 50%), linear-gradient(90deg, #89cac0 50%, transparent 50%), linear-gradient(0, #89cac0 50%, transparent 50%), linear-gradient(0, #89cac0 50%, transparent 50%); background-repeat: repeat-x, repeat-x, repeat-y, repeat-y; background-size: 10px 2px, 10px 2px, 2px 10px, 2px 10px; animation: marching-ants 400ms infinite linear; }

Это текст!

Как сделать текст у checkbox'а зачёркнутым?

Привет всем! Есть такой чекбокс
CheckBox todo = new CheckBox(this); todo.setText(task);
где task - это просто строка, например, "магазин"
вопрос - как можно сделать текст этого чекбокса зачёркнутым по нажатию? (слушатель уже на нём висит, я просто не могу понять\найти - как зачеркнуть текст, когда я поставил галочку)


Ответ

Вам нужно в слушателе, если была поставлена галочка, из текста чекбокса создавать объект SpannableString, задавая ему стиль зачёркнутой строки. Потом передавать этот объект в чекбокс методом setText
SpannableString string = new SpannableString(todo.getText()); string.setSpan(new StrikethroughSpan(), 0, string.length(), 0); todo.setText(string);
Источник.

Как плавно сделать обводку обрезанного svg?

Здравствуйте. У блока левый верхний угол 45 градусов, сделал svg с clipPath, но не удается сделать обводку для этого угла. Подскажите как сделать обводку без швов.
html, body { margin: 0; width: 100%; } body { background: url(https://arti911.github.io/assets/images/nyamushka/bg.jpg) no-repeat center / cover; overflow-y: scroll; padding: 10px; }


Ответ

Вариант с псевдоэлементом:
* { margin: 0; padding: 0; } body { display: flex; justify-content: center; align-items: center; } .block { margin-top: 15px; position: relative; background-color: dodgerblue; width: 200px; height: 200px; border-radius: 15px; -webkit-clip-path: polygon(16% 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 16%); clip-path: polygon(16% 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 16%); } .block::before { content: ""; position: absolute; top: 5px; left: 5px; width: 190px; height: 190px; border-radius: 15px; background-color: #fff; -webkit-clip-path: polygon(16% 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 16%); clip-path: polygon(16% 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 16%); }


Почему при записи большого числа во float меняются цифры на конце?

Записываю во float myVar число 0xBCA8F85D, если представить это число в десятичном виде в калькуляторе, получаю 3165190237, однако если вывести через printf("%f",a); результат 3165190144, объясните пожалуйста почему так происходит?


Ответ

Стандарт IEEE-754 описывает 32-битное число с точкой, как содержащее 1 бит знака, 8 бит экспоненты и 23 бита мантиссы. В частности, это означает, что точность хранимого числа "всего лишь" около 7 знаков, а разрешенный диапазон, около 10^38.
При записи числа, мантисса дает вам 23 бита на то чтобы записать число (от 1.0 до 2.0), а экспонента дает вам 8 знаков на то чтобы записать степень. При этом экспонента выбирается минимальной (для наибольшей точности по мантиссе). Возьмем простой пример по 2 бита - мантисса от 1 до 2 с шагом 0,25, а экспонента 1/2/4. Как нам записать в такое число 0.19 ? Никак, мы можем записать только максимально приближенное 1,5 ^ -4 и получим 0,197530864197530. Другой ближайший сосед будет .. (не знаю точно, но допустим) 0,1741254. И тогда что бы мы не ввели оно будет "округлено" до ближайшего представимого числа в нашем "float5".
Соответственно в вашем случае, полагаться можно только на первые 7 цифр - 3165190***, а последние три будут "как получится".
Зачем же нужен такой тип, если он даже не может вместить в себя int ? Затем, что в его особенности - его сила. Обычно при работе с числами не так важны мелкие значения на фоне больших. Работаете с миллиардами, не обращаете внимания на единицы. Работаете с миллиметрами - не важны нанометры.

Как сделать массив double nullable

Как сделать массив double nullable?
double[,] numbersArray = new double[3, 3];


Ответ

1 вариант:
double?[,] numbersArray = new double?[3, 3];
2 вариант:
Nullable[,] numbersArray2 = new Nullable[3, 3];
можно даже так:
Nullable[,] numbersArray3 = new double?[3, 3];
И вот так:
double?[,] numbersArray4 = new Nullable[3, 3];
Выбирайте!

Стили футера в зависимости от высоты блока

Можно ли сделать так, чтобы если блок меньше высоты окна страницы(короткое объявление), то футер был бы прижат к нижней части окна браузера, а если блок больше и появляется скролл, то футер бы был сразу под этим блоком?


Ответ

Это просто реализовать с помощью flexbox в роли контейнера:
let cntnt = document.getElementById('content'); cntnt.addEventListener('click', function () { this.innerHTML += '

параграф

'; }); html, body { margin: 0; padding: 0; } #page { height: 100vh; display: flex; flex-direction: column; font: 16px sans-serif; color: #fff; } #page > div, #content > p { padding: 10px; text-align: center; } #page > div { flex 0 0 auto; } #content { background-color: #44a; } #footer { margin-top: auto; background-color: #4a4; }
кликайте по этому блоку
для увеличения его высоты

Принцип здесь очень прост: Вертикальное направление дочерних элементов контейнера задается стилем flex-direction: column Стиль flex 0 0 auto у дочерних блоков "отключает" заполнение ими свободного пространства, и сжатие при увеличении размера "соседей" - но позволяя при этом автоматически подстраиваться под размеры содержимого. При малой высоте блока контента, футер "прилипает" к нижнему краю за счет margin-top: auto.

Что можно почитать о flexbox: Используем CSS Flexible Boxes (MDN) A Complete Guide to Flexbox (CSS-Tricks)

Отлов события изменения ObservableCollection

Есть приложение в котором пользователь может указывать название продукта и его цену, по нажатию на кнопку эти данные вносятся в ObservableCollection и сразу же отображаются в DataGrid. Также в окне присутствует textbox в котором должна отображаться средняя цена всех внесенных продуктов. Проблема в следующем: Нужно чтобы пользователь в DataGrid мог изменять цену уже внесённых продуктов после чего сразу же должна изменяться средняя цена (AvaragePrice) всех продуктов, а этого не происходит, данные в коллекции изменяются, но изменения вышеуказанного свойства не происходит: MainWindow.xaml:






Запуск функции после setTimeout() [дубликат]

На данный вопрос уже ответили: Начало выполнения функции по таймеру бездействия 1 ответ Есть строка поиска. Хочу чтобы при окончании ввода в строку через секунду запускалась(1 раз) функция. Есть код:
$('.block input[name=search]').on("input", function () { setTimeout(findUser, 1000);
function findUser() { alert("Hello"); }
})
Код работает неправильно. Он запускает функцию столько раз сколько я нажму, а мне нужно при окончании ввода и 1 раз. Если есть свои варианты кода то пожалуйста


Ответ

Для того, чтобы таймер срабатывал один, предыдущий таймер должен быть остановлен с помощью функции clearTimeout
Для этого нужно сохранить предыдущий таймер в переменную:
var timer = null; $('.block input[name=search]').on("input", function () { clearTimeout(timer); timer = setTimeout(findUser, 1000);
function findUser() { alert("Hello"); }
})

Обращение к методу Nullable переменной в Kotlin

Пытаюсь перевести следующий код из java в kotlin:
private LGMThread lgmThread;
if (!lgmThread.isThreadStarted()) { lgmThread.start(); } else { lgmThread.openChannel(); }
Вместе с автоматическим конвертером кода Android Studio я перевела это в:
private var lgmThread: LGMThread? = null
if (!lgmThread.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() }
однако при этом AS ругается на выражение !lgmThread.isThreadStarted()

Я пробовала исправить это следующим образом:
lgmThread?.let { if (!lgmThread.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() } }
однако это не решает проблему:

И код
if (lgmThread != null) { if (!lgmThread.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() } }
приводит к точно такому же результату.
Код
if (!lgmThread?.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() }
также приводит к другой ошибке:

С оператором !!, конечно, ошибка исчезает:
if (!lgmThread!!.isThreadStarted()) { lgmThread?.start() } else { lgmThread?.openChannel() }
однако я не хочу использовать этот способ. Как правильно избавиться от этой ошибки, не прибегая к оператору !!?


Ответ

Так как lgmThread имеет тип LGMThread?, то и возвращаемое методом lgmThread?.isThreadStarted() значение будет иметь тип Boolean?
В таком случае в блоке if вы можете проверять lgmThread?.isThreadStarted() на true, false и null
Соответственно, кусок кода может выглядеть следующим образом:
private var lgmThread: LGMThread? = null
if (lgmThread?.isThreadStarted() == false) { lgmThread?.start() } else { lgmThread?.openChannel() }

P.S. Но будьте внимательны, так как в таком случае код в блоке else выполнится при lgmThread?.isThreadStarted() равном true и null

Каким образом определены операторы у System.Int32 и прочих?

Товарищи, возник следующий вопрос: балуясь с рефлексией, можно из классов доставать методы, определяющие работу их операторов сложения, вычитания и прочих, зная специальные имена (вроде op_Addition). К примеру сей код:
DateTime test = (DateTime)typeof(DateTime).GetMethod("op_Addition").Invoke(null, new object[] { DateTime.Now, new TimeSpan(10) });
Работает аки часы. Однако подобный «трюк» не проходит с Int32, String и некоторыми другими классами. Такое чувство, будто для них и не определены таковые операторы, хотя мы знаем, что это не так Собственно, делая выжимку, мой вопрос таков: где упрятаны методы, определяющие операторы сложения и подобных для Int32, к примеру?


Ответ

Они нигде не спрятаны, таких методов попросту нет. Когда компилятор обрабатывает оператор сложения для Int32, он просто генерирует add инструкцию в IL коде. Это сделано в целях производительности.
Аналогично со всеми базовыми типами, которые умеет обрабатывать процессор напрямую: Int64, float, double
Исключение из этого правила - тип string. Когда компилятор встречает оператор + для строк, он генерирует вызов статического метода Concat(string, string)

C# Как получить букву только что подключённой флешки?

Копал в сторону DriveInfo, но сравнивать два массива — не слишком изящное решение.


Ответ

Можно использовать технологию WMI
Подключаете к проекту сборку System.Management.dll.
Пишете следующий код:
using System.Management;
var watcher = new ManagementEventWatcher(); var query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2"); watcher.Query = query; watcher.EventArrived += Watcher_EventArrived; watcher.Query = query; watcher.Start();
private static void Watcher_EventArrived(object sender, EventArrivedEventArgs e) { var driveName = e.NewEvent.Properties["DriveName"].Value.ToString(); Console.WriteLine(driveName); }
В событии получаем букву диска.
Объект ManagementEventWatcher является Disposable, поэтому крайне желательно после окончания работы с ним освободить ресурсы вызовом метода Dispose (или используйте using, если возможно).
Подробнее можно посмотреть здесь

Когда нужно использовать `{` в операторе `if`? [дубликат]

На данный вопрос уже ответили: Объясните мне пожалуйста, зачем нужно всегда ставить { и } 12 ответов Пример , в 1 случае используется , а во 2 - нет
if (inputField.value.length == 0) { if (helpText != null) helpText.innerHTML = "Please enter a value."; return false; }


Ответ

Если оператор должен охватывать одно утверждение то {} не обязательно в противном случае обязательно. Вы можете использовать кривые скобки для любого оператора if

Объявление массивов в С++

Инициализация массива в Java:
int[] array = new int[10];
В то время как в С++:
int array[10];
Вопрос. Есть какая-то разница в том, что в С++ не используется оператор new и когда используется new, а когда нет?
С джавы я уже привык, что запись: int array[] - это только создания ссылки.


Ответ

Аналогом джавового выражения в C++ будет int *arr = new int[10];, ибо иначе массив выделяется на стеке, а не в хипе.
Семантики выражения int array[10]; в Java нет.

Неверный порядок выполнения алгоритма на Python в функциональной парадигме

Нужно решить задачу полностью в функциональном стиле, т.е. в одну строку, без циклов (совсем нельзя использовать for) и без присваиваний.
Задача требует сначала ввести число n, затем вводится n последовательностей. К ним нужно применить функцию zip (дальше не важно, к вопросу не относится). Написал такой код:
print(*zip(map(lambda x: list(map(int, input().split())), range(int(input())))))
До применения zip всё правильно, но в zip, кажется, последовательности передаются по одной, так что, на практике выходит так:
Ввод:
2 0 0 1 1
Правильный вывод:
(0, 1) (0, 1)
Действительный вывод:
([0, 0],) ([1, 1],)
Как сделать правильно, и чтобы при этом оставаться в функциональной парадигме?


Ответ

Добавив к вашему решению одну звездочку можно получить необходимый результат:
print(*zip(*map(lambda x: list(map(int, input().split())), range(int(input()))))) # ^ <--- NOTE
вывод:
(0, 1) (0, 1)
пояснение на примере:
In [159]: list(zip([[0, 0], [1,1]])) Out[159]: [([0, 0],), ([1, 1],)] # то что получилось
In [160]: list(zip([0, 0], [1,1])) Out[160]: [(0, 1), (0, 1)] # то что нужно получить
In [161]: list(zip(*[[0, 0], [1,1]])) # решение Out[161]: [(0, 1), (0, 1)]
PS Что значит * (звёздочка) и ** двойная звёздочка в Питоне?

Функция zip(*iterables) принимает ноль и более позиционных аргументов и разница в вызове zip(lst) и zip(*lst) в том как будут обрабатываться переданные аргументы:
при вызове: zip(lst) - передается один аргумент типа list при вызове: zip(*lst) - передается все содержимое списка как отдельные позиционные аргументы
Пример с функцией print()
In [105]: lst = [1,2,3]
In [106]: print(lst) [1, 2, 3]
In [107]: print(*lst) 1 2 3
тот же результат мы получим передав три раздельных параметра:
In [108]: print(1,2,3) 1 2 3

Чистые виртуальные функции и чистый виртуальный деструктор обьявленные с пустым телом

до сих пор я знал что чистым виртуальным функциям не нужно тело, и обьявлять их даже с пустым телом, является ошибкой. Мне недавно говорят обратное:
class A { public: ~A() = 0 {} //... }
Что так не то что нельзя, но и нужно так обьявлять...
Вопрос
Скажите пожалуйста, зачем чистой виртуальной функции тело? Тело чего? Где смысль чистой виртуальности тогда? И в конце концов, если это правда, почему тогда мой компилятор выдает ошибку? Это что то новое после C++14?..
Вот ошибка моего компилятора:
C:\Users\Mk\Documents\H\C++\test\main.cpp:12: error: pure-specifier on function-definition virtual ~A() = 0 {}


Ответ

Формально в 10.4.2 есть замечание-
Объявление функции не может содержать одновременно чистый-спецификатор и описание функции. ■ Пример. struct C { virtual void f() = 0 { }; // неправильно }; Конец примера.
Но при этом ее можно определять:
Описывать чистую виртуальную функцию необходимо только в случае, когда она вызывается посредством синтаксиса квалифицированного-идентификатора (5.1), или похожим образом (12.4).
Т.е., похоже, что чисто виртуальная функция может быть определена, но только не в объявлении.

System.Reflection получить экземпляр класса

Какой метод в Reflection может дать мне пустой экземпляр класса?


Ответ

Activator.CreateInstance
var instance = (ObjectType)Activator.CreateInstance(typeof(ObjectType));

Составление календаря футбольного чемпионата на Python

Суть задачи такова: Пусть у нас есть чётное число N команд. Требуется составить календарь игр, который будет удовлетворять следующим условиям:
Команды играют по круговой системе (каждая играет с каждой) Календарь поделен на туры (которых, очевидно, будет N-1) Каждая команда играет строго одну игру за тур
Пишу сюда впервые, изучаю Python совсем недавно. На первый взгляд задача очень простая, но корректно накодить у меня не получается. Заранее спасибо за ответы!


Ответ

Реализация на Питоне round-robin алгоритма из @MBo ответа
import collections
teams = "ABCDEF" n = len(teams) tail = collections.deque(teams[1:n//2] + teams[n//2:][::-1]) for _ in range(len(tail)): print_round(teams[0], *tail) tail.rotate()
где print_round() показывает текущий тур:
def print_round(*teams, sep='
'): n = len(teams) print(*teams[:n//2]) print(*teams[n//2:][::-1]) print(end=sep)
Результат
A B C D E F
A D B E F C
A E D F C B
A F E C B D
A C F B D E
 

Одновременное обновление родительской и дочерней таблицы по ключу

Есть table1 c tab1_id primary key и table2 c tab1_id foreign key. Нужно изменить table1.tab1_id. При попытке изменить tab1_id в любой из таблиц ругается на нарушение целостности:
Update table1 set tab1_id = 22 where tab1_id = 11
ORA-02292: "обнаружена порожденная запись"
Update table2 set tab1_id = 22 where tab1_id = 11
ORA-02292: "Исходный ключ не найден".
Можно ли сделать апдейт сразу в 2 таблицы? Или как обойти это ограничение не внося ограничение в структуру таблицы (без alter table)?


Ответ

Вариант 1:
шаг 1. выключаем внешние ключи(alter table disable constraint)
шаг 2. обновляем данные для обоих таблиц(update table1 set tab1_id = .., update table2)
шаг 3. включаем обратно внешние ключи(alter table enable constraint)
Вариант 2:
Объявляем наш constraint как defferable
alter table table2 add constraint constraint_name foreign key (tab1_id) references table1(tab1_id) deferrable;
Обновление таблицы выполняем в PL\SQL блоке:
begin execute immediate 'set constraint constraint_name deferred'; update table1 ..; update table2 ..; commit; end;
PS:
У вас что-то странное с архитектурой БД. При правильной архитектуре не должно возникать ситуации, когда необходимо править ID

Язык C и способы информирования о результатах действий

Тема непростая и обширная, и я очень хочу как следует в ней разобраться, но в книгах информации мало, да и часто оказывается, что реальный опыт мало пересекается с теорией.
В языке С существует огромное количество способов сообщать о результатах действий и возникших ошибках. Сейчас в меня кто-то кинет тухлым овощем, возражая, что в C имеются только лишь примитивные коды возврата.
Да, только коды возврата... Но они используются очень по-разному.
Конечно, можно реализовать исключения, используя setjmp/longjmp. Но, как сказал Д. Ритчи: Если тебе нужен PL/1, ты знаешь, где его взять...
Вот варианты обработки результатов выполнения, которые мне встречаются чаще всего:
Функция возвращает код, который является отчетом о ее работе:
const int r_code = some_func(a, b, c); Или, например, функция возвращает указатель на созданный объект, а в случае, если объект создать не удалось, функция возвращает NULL, не предоставляя никакой дополнительной информации о причине неудачи:
object *obj = object_create(a, b, c); Так же, функция может возвращать указатель на созданный объект, записывая в заданное расположение детальный отчет об операции (а не просто дополнительную информацию об ошибке):
information i; object *obj = object_create(a, b, c, &i); Еще функция может использовать глобальную переменную текущего потока для предоставления информации об ошибке:
FILE *f = fopen(a, b); if (f == NULL) { // Обработка errno()
И еще примерно бесконечное количество вариантов...
При написании кода часто приходится жонглировать различными способами обработки ошибок и информирования о результатах действий.
Мои вопросы:
Есть ли в C универсальный способ для всего этого? А если нет, то в чем причина? Было бы интересно узнать, какие еще существуют подходы, в чем их плюсы и минусы? Есть ли большая разница в сложности разработки/поддержки кода, который использует/не использует исключения? Речь идет не про исключения в C++, а про исключения в языках с полноценной сборкой мусора - аля Java
Например, я некоторое время писал на Java, так вот, когда я увидел реальный промышленный код, в котором ловились и проверялись все исключения, какие только возможно, то я вообще не понимал, как это можно поддерживать и развивать, когда на 5 строчек библиотечных вызовов приходится писать сотни строк try/catch/finally... И при любой малейшей правке приходится перекапывать весь код, чтобы где-то в 100500 ветке обработки ошибки добавить поддержку обработки исключения, которого раньше не существовало.


Ответ

Попробую ответить, хотя это и очень сложно, учитывая, кто спрашивает и как.
Есть ли в C универсальный способ для всего этого? А если нет, то в чем причина?
Универсального способа нет. Рекомендованного к использованию нет. Почему так? все очень просто - это чистый си. Тут программист сам ответственный за свой код, никто не будет ему вытирать ручки и рот.
Было бы интересно узнать, какие еще существуют подходы, в чем их плюсы и минусы?
В принципе были перечислены все обычные способы. Еще есть несколько методов
забить на ошибки (очень часто применяется) использовать сторонний фреймворк (да, для си такое есть. К примеру cello).
Есть ли большая разница в сложности разработки/поддержки кода, который использует/не использует исключения? Речь идет не про исключения в C++, а про исключения в языках с полноценной сборкой мусора - аля Java.
Сборка мусора имеет весьма относительное отношение к исключениям. И делать какие то умозаключения с изначально неверного предположения чревато странными выводами. Поэтому, даже не будут обсуждать где лучше исключения или сборка мусора. Оставим это холивар-экспертам.
Но в жава с спецификацией исключений действительно беда. Нужно либо пробрасывать постоянно весь список допустимых исключений, либо писать базовый и не переживать. В с++ это также пытались сделать, но вовремя отказались (и сделали noexcept, который более понятный).
При разработке с исключениями самое главное, что сложно допустить ситуацию, когда программа пошла в разнос. К примеру, одна функция инициализирует объект, а вторая его использует. Если первая может вернуть NULL, а вторая этого не ожидает... то ошибку можно долго и нудно искать. С исключениями это придется обработать и дальше код не пойдет (но все равно, программист это должен закодить, само оно редко так бывает сразу и красиво).

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

Редко я работаю с аргументами командной строки из программы на C/С++. Подскажите, должен ли я высвобождать массив char *argv[] delete[]'ом, который пришел в качестве параметра в функцию main или этим займется система?
int main(int argc, char *argv[]) {...}
P.S. мне бы хотелось узнать точно, как делать правильно.
Вообще мысли такие - раз не я отводил память, то и не мне ее освобождать. (Вольная интерпретация концепции, когда отведение и высвобождение должно производиться на одном уровне абстракции в коде)


Ответ

Нет, высвобождать не надо. Действует простое правило: кто выделил - тот и высвобождает. В данном же случае main() получает указатель на участок памяти, выделенный до того.

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

Программа на С# (но в принципе это не столь важно), до этого использовал стандартный app.config, быстро удобно, но его возможностей стало не хватать. Во первых параметров стало много: сохранение состояний всех окон, некоторых контролов, настройки самой программы, настройки подключения к серверу, которые надо шифровать ну и т.д. В общем решил написать свой велосипед, теперь думаю где это все хранить, и соответственно как реализовать. На данный момент склоняюсь к созданию своего класса настроек и его бинарной сериализацией, но вот вопрос, где его хранить? Не хотелось бы его держать в папке с программой, и для каждого пользователя иметь отдельные настройки.


Ответ

Тогда храните в профиле текущего пользователя. А сериализацию лучше делать через xml, чтобы при необходимости можно было поправить конфиг руками.

Зачем нужно опережающее объявление?

Есть два класса - MdiChild и MainWindow. В заголовке MainWindow приведено объявление: class MdiChild; А вот в самом mainwindow.cpp подключен mdichild.h. С какой целью так делается? Можно ведь подключить mdichild.h в mainwindow.h? Или нет? P.S. Название вопроса написал по-дурацки. Ломал голову. Исправьте если кто придумает нормально.


Ответ

То, что Вы привели - это распростанненный хак. Для того, что бы иметь указатель или ссылку на класс, компилятору не нужно знать реальный размер класса. А не подключают заголовок по одной простой причине - ускорить компиляцию. Компилятор не будет разбирать большие заголовки и как следствие, компиляция может ускорится очень сильно. Так к примеру, рекомендуют делать в Google. В некоторых случаях даже создают отдельно компактные h файлы для включения. Более того, в стандартной библиотеке есть даже файл заголовка iosfwd - он нужен тогда, когда нужно использовать классы с iostream, но только указателиссылки (например, в заголовочном файле объявляется перегруженный оператор <<)

Как заменить ветку master другой веткой?

Ситуация такая: была ветка master. В какой-то момент от нее отделилась ветка new_feature. Потом основная разработка велась в этой новой ветке, а в ветке master проводился только багфикс и добавление маленьких фич. В конечном итоге, в ветке new_feature проект был по сути переписан, многие файлы удалены, сильно поменялась структура и т.п.
Вопрос: можно ли теперь как-то ветку master сделать веткой, например, old_version, а ветку new_feature сделать master-ом?


Ответ

Если смержить точно не получается, то подменить ветки можно следующим образом: git checkout new_feature git merge -s ours master git checkout master git merge new_feature Естественно, что такой реплейс веток приведет к проблемам при pull у всех девелоперов, которые продолжали работать над master, поэтому стоит сообщить им о том, что все было переписано и попросить сделать reset --hard

Получение значений переданных методом POST в Go

Подскажите, пожалуйста, как в Go собрать все значения, переданные программе методом POST?
Примерно такой код:
package main import "net/http" func main() { http.HandleFunc("/", handler) http.ListenAndServe(":80", nil) } func handler(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { // Как собрать все значения POST ??? } ***** }
Вариант r.FormValue("FIELD_NAME"), к сожалению, не подходит, поскольку мне заранее неизвестно, какие именно поля будут переданы.


Ответ

С http в Go не работал, но в официальных доках в описании структуры Request есть поле Form типа url.Values, которое становится доступным после ParseForm Кароче делай ParseForm, а потом цикл for по r.Form

Литература по Embedded [закрыт]

Доброго времени суток знатокам ! Я сам из Украины, закончил местный ВУЗ, и хочу уйти с головой в Embedded даже не смотря что это не перспективно и зарплаты значительно ниже от WEB-разработчиков, но так сложилось что не люблю я копаться в тоннах HTML-кода или JS просто WEB мне не по душе, мне нравиться работать на уровне ядра ОС и железячки. Вопрос таков, кто-нибуть знает толковую литературу по этой теме ? Искал про контроллеры ARM (с которыми хочу поработать) так либо всякий бред качаю, либо никто разумного ничего не написал, ничего про Embedded толкового не нашёл, может кто-то ещё что либо подскажет (в какую сторону двигаться, но только в Embedded направлении) ! Короче люди я буду ждать любой совет, ресурс, подсказку, направление, очень хочу всё это охватить, познать и поработать !!!


Ответ

Дружище поверь, ты будешь плеваться потом долго и упорно что не стал заниматься как я вебом, а ушел как я в железо. Для начала, Должен знать Си просто изумительно, asm по ходу будешь догонять, есть есть с++ знания. Если будешь знать что есть транзисторы и тп вообще прекрасно (разбираться в схеме) вообще прекрасно купи себе отладку недорогую, Например на LPC1111(14) Выглядит отладка так (http://im6-tub-ru.yandex.net/i?id=599861828-08-72&n=21 ) lpcexpresso. Прочитай даташит к процу и юзермануал, разберись, немного страниц 800 английским. Читай как работать с UART,SPI,I2C,RTC и другой периферией. На отладке есть термодатчик и еще что-то с чем можно повзаимодействовать. Покупай или дербань сотовые достовай из них дисплее ищи инфу и выводи что нибудь на экран. Если будет у тебя проц с USB, попробуй и в нем разобраться. Как поймешь что к чему, Купи получше проц и SWD или JTAG отладчик, GSM, GPS модули,SD карту, сделай например проект типа GPS маячек. Можешь попробовать проект реализовать на RTOS, и использовать многопоточность. К изучению как минимум http://books.tr200.ru/v.php?id=804485 Качай с сайтов примеры кода работы с периферией, смотри что к чему. Если тяжелой книга окажется, тогда уходи в RISC процессоры AVR или PIC(16)(24)

Форма обратной связи

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

Надо, чтобы изначально была кнопка, а потом она будто вытягивается и там два инпута. И сворачивается. Я сколько ни делаю уже, постоянно криво. Делал через .toggleClass вытягивание, не знаю как сделать.


Ответ

Поправил чуть:
http://jsfiddle.net/alpha9000/SbxHT/
$('#feedback div').click(function(){ $('#feedback ul').toggle(300); }); $('#feedback a').click(function(){ var kx='name='+$('#feedback input[name=fname]').val()+'&phone='+$('#feedback input[name=phone]').val(); // передаём в $_POST на feedback.php $.ajax({ url: 'feedback.php', type: 'POST', dataType: 'html', data: kx }); $('#feedback ul').toggle(300); return false; }); /* а в PHP напишите чтобы сохраняло в файл: $val) { $k = trim($_POST[$key]); $_POST[$key] = addslashes($k); } $filename = 'msg.html'; $somecontent = '

' . $_POST['name'] . '->' . $_POST['phone'] . '
'; $handle = fopen($filename, 'a'); fwrite($handle, $somecontent); fclose($handle); echo "Спасибо! Ваше сообщение отправлено."; ?> и всё) */ * { padding: 0px; margin: 0px; font-family: 'Calibri', serif; font-size: 1em;} #feedback { position: absolute; right: 5%; bottom: 5%; background: #ddd; width: 250px; border-radius: 5px; box-shadow: 0px 0px 3px 2px rgba(0,0,0,.5);} #feedback div {text-align: center; cursor: pointer; padding: 2px;} #feedback ul { padding: 0px 10px 5px 10px; list-style: none; display: none;} #feedback li { margin-bottom: 5px; } #feedback input { display: block; width: 225px; } #feedback a { background: #999; color: #000; border-radius: 5px; padding: 0px 5px; text-decoration: none; transition: background 0.3s 0s;} #feedback a:hover { background: #333; color: #fff; } #feedback .last { text-align: right; }
Заказать обратный звонок