Страницы

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

вторник, 23 апреля 2019 г.

Проблема с дженериками в java

Пытаюсь сделать так, чтобы выполнялось арифметическое действие, и, в зависимости от того, какое число должно выводиться на экран, метод возвращал или int или double.
реализую это так:
@FunctionalInterface public interface JoinMathAction { T mathAction(Number a, Number b); }
public class GoMath { public T getResultMath(T arg1, T arg2, String op) { Number res = 0;
if (arg1 instanceof Integer && arg2 instanceof Integer) { JoinMathAction mm = (a, b) -> { int argFirst = a.intValue(), argSec = b.intValue(); switch (op) { case "/": { if(argFirst == 0 || argSec == 0) { try { throw new DivZeroException("Ділення на 0 неможливе"); } catch (DivZeroException d) { System.out.println(d.getMessage()); } } else { return argFirst / argSec; } } case "*": { return argFirst * argSec;
} case "-": { return argFirst - argSec; } case "+": { return argFirst + argSec; } } return 0; };
res = mm.mathAction(arg1, arg2);
} else if (arg1 instanceof Double || arg2 instanceof Double) { JoinMathAction mm = (a, b) -> { double argFirst = a.doubleValue(), argSec = b.doubleValue(); double result = 0;
switch (op) { case "/": { if(argFirst == 0 || argSec == 0) { try { throw new DivZeroException("Ділення на 0 неможливе"); } catch (DivZeroException d) { System.out.println(d.getMessage()); } } else { return argFirst / argSec; } } case "*": { return argFirst * argSec; } case "-": { return argFirst - argSec; } case "+": { return argFirst + argSec; } } return result; };
res = mm.mathAction(arg1, arg2); } return (T) res; } }
Все работает, но как сделать с двух switch один? И как это сделать грамотно?


Ответ

Что не так с генериками уже объяснили. Я же представлю вариант выхода из безвыходной ситуации с одним switch-ом. Сделайте из Number BigDecimal. У него есть методы, реализующие арифметические операции. Складывайте, вычитайте, умножайте и делите BigDecimal в одном switch-е, а результат переведите обратно в int или double:
public T getResultMath(T arg1, T arg2, String op) { BigDecimal bigArg1 = new BigDecimal(arg1 instanceof Integer ? arg1.intValue() : arg1.doubleValue()); // или в любом случае используя doubleValue BigDecimal bigArg2 = new BigDecimal(arg2.doubleValue()); BigDecimal bigResult; switch (op) { ... case "*" : bigResult = bigArg1.multiply(bigArg2); break; ... } // Округления при переводе в int сами найдёте как сделать return (T) (arg1 instanceof Integer ? new Integer(bigResult.intValue()) : new Double(bigResult.doubleValue())); }
Вообще-то не обязательно использовать BigDecimal. Можно тот же double с успехом применить.

Как узнать к какому Reference относится та или иная библиотека

В папке bin/Release по итогу оказывается множет dll+xml в связке. Каким образом можно узнать к какому Reference относится каждая dll?
По идее сколько References столько и dll должно быть в каталоге bin/Release, так? У меня же это не так: дополнительно создаются другие dll, которые как-то имеют отношение к References. Но как выявить это отношение?
Спасибо!
P.S. Я использую сторонние компоненты (DevExpress), но вопрос всё же общий.


Ответ

В свойствах каждой Reference есть параметр CopyLocal. Если true - то соотв. дллка будет скопирована при компиляции в папку с бинарниками. Также туда попадут файлы которые добавлены в проект и в свойствах которых соответствующим образом установлено значение поля 'Copy to Output Directory', например это могут быть сторонние дллки, которые необходимы твоему приложению или другие файлы, например локальная база данных. Также в свойствах проекта в разделе 'Build Events' есть поля для записи скриптов выполняемых до и после компиляции. И там вполне могут быть инструкции копирования файлов (любых, куда угодно). И еще различные производители для локализации используют ресурсные дллки (по каждому языку), например производители контролов - точно. Эти дллки (или даже папки с дллками) в итоге тоже попадают в папку с бинарниками

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

У меня на телефоне перестали работать сенсорные кнопки.
Решил сделать так, чтобы сверху в тлф висело уведомление, при нажатии на которое открывался рабочий стол. Собственно как системно открыть рабочий стол (т.е. сымитировать нажатие на кнопку "Домашний экран")?


Ответ

public void backHome() { Intent home = new Intent(Intent.ACTION_MAIN); home.addCategory(Intent.CATEGORY_HOME); home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(home); }

Приведение типов java (Arrays.asList ->List )

Допустим есть следующий код:
public static void main(String[] args) { Integer[] mass = {1, 8, 9, 12, 15, 14, 17, 13}; List r = Arrays.asList(mass); System.out.println(r.get(3)); System.out.println(r.remove(3));
}
r.get(3) возвращает какое-то значение а r.remove(3) кидает
UnsupportedOperationException at java.util.AbstractList.remove
r.getClass().getName() возвращает java.util.Arrays$ArrayList
Насколько я понял метод asList класса Arrays возвращает экземпляр внутреннего класса java.util.Arrays$ArrayList который имплементит List метод get вроде нормально там реализован а метод remove перевызывает remove у AbsttactList который кидает данное исключение.
Как можно из массива получить экземпляр нормального Arrayslist или LinkedList?


Ответ

Попробуйте объявить r как ArrayList вместо List. При этом создав новый экземпляр ArrayList через конструктор ArrayList(List list)
ArrayList r = new ArrayList<>( Arrays.asList(mass) );

Не видит System.out.print в новом классе

Пользуюсь Intellij Idea. При создании нового класса (не main) не работает команда System.out.print. Компилятор пишет, что не может решить символ. В классе с методом main все работает. Не пойму в чем дело.


Ответ

Вы объявляете класс и сразу же пишите вызов метода System.out.print() - это недопустимо. Использование метода возможно в инициализаторе, конструкторе или другом методе:
public class sfe { { System.out.print(""); // в инициализаторе. }
public sfe() { System.out.print(""); // в конструкторе. }
public void print() { System.out.print(""); // в другом методе. } }

Выполнить операцию при неожиданном завершении работы программы

Часто бывает такой случай, когда программа вылетает, не закончив корректно свою работу. И важно в таком случае сохранить все те изменения, которые не успел сохранить пользователь.
Объясню на своем примере. У меня создан простенький текстовый редактор с функцией автосохранения. Через определенный интервал времени сохраняется временный файл с измененным текстом, который без желания пользователя не был сохранен в главном файле. Временный файл скрыт и зашифрован, как обычно это делается. Когда программа успешно завершает работу, временный файл удаляется, а изменения сохраняются в главном файле, если пользователь захотел сохранить. Все сохраняет, все удаляет.
Теперь важно сделать так, чтобы при неожиданном завершении работы программы, или по другому при некорректном, временной файл стал видимым и незашифрованным для пользователя. Какие команды прописывать я знаю, не знаю как их правильно вызвать, в каком момент.
Можете что-нибудь подсказать по данному вопросу?


Ответ

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

Удаление повторяющихся символов (&<>"'\/;:%^?)

Нужно удалить указанные символы при вводе в поле.
Делаю вот так
$('#tochange').bind("change keyup paste input", function(e) { $(this).val($(this).val().replace(/[&<>"'\/;:%^?]/,"")); });
Но если вставлять несколько одинаковых, например, ''''''''':::: то некоторая их часть остаётся и потом стирается в процессе ввода, как быть?


Ответ

Добавьте модификатор global (g):
$(this).val($(this).val().replace(/[&<>"'\/;:%^?]/g,""));
Это будет заменять все указанные знаки не один раз, а по всей длине данного текста...

Получить значение по индексу в enum

Собственно есть enum:
enum DECK_COUNT { DECK_X1 = 1, DECK_X2 = DECK_X1 << 1, DECK_X3 = DECK_X2 << 1, DECK_X4 = DECK_X3 << 1 };
Есть ли возможность без лишних заморочек получить значение из перечисления по индексу?


Ответ

Добавьте enum'ы START и END - вот вам и индекс и границы цикла. Так делали в далёком прошлом.
И используйте enum class, enum - это пережитки прошлого.
enum class eShipType { START,
DESK_1, DESK_2, DESK_3, DESK_4,
END, }; eShipType getShipByIndex(const size_t index) { return (index >= static_cast(eShipType::START) && index <= static_cast(eShipType::END)) ? static_cast(static_cast(eShipType::START) + index) : throw ExpectionOutOfRange("eShipType with index " +std::to_string(index) ); }

Update: так же отмечу, что случаи когда enum'у нужны явные значения очень очень редко - и как вы уже догодались типы кораблей для игры морской бой - не тот случай.

Трансляция twitch.tv в android

Делаю приложение игровой тематики, в которой одна из рубрик - прямые трансляции игр. Собственно, есть прямые адреса на стримы, к примеру http://player.twitch.tv/?channel=starladder1
Что пытаюсь сделать я:
final WebView webView = (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); webView.setWebChromeClient(new WebChromeClient()); webView.loadUrl(url);
Результат - открывается webview в котором пишется, что надо установить flash player.. Хотя в официальном приложении twitch воспроизводится всё отлично без флэша. Понимаю, что возможно даже не в ту сторону копаю, но есть ли у кого какие догадки? Буду рад любой помощи!


Ответ

Нашел решение для WebView. Все оказалось просто:
webView.loadUrl("http://www.twitch.tv/" + chanelName+ "/popout");

Как выбираются ресурсы из папок xhdpi, hdpi, mdpi и подобных для конкретного устройства?

В моём приложении есть фон и картинка на нём. По умолчанию у меня в AS есть только папка drawable. Создал xxhdpi, xhdpi, hdpi, mdpi в директории res, раскидал по ним уменьшенные копии картинки и фона. Я так понял, приложение само должно брать картинку из определённой директории в зависимости от разрешения экрана. Но я не понимаю даже, как и к какой картинке обращаться в коде. Помогите, пожалуйста, разобраться.


Ответ

Для начала вам необходимо ознакомиться с официальным руководством по поддержке устройств с разными размерами экранов. Там предельно подробно объясняется ВСЕ по этой теме.
Для того, чтобы система использовала определенное изображение для какой-то плотности экрана есть два способа:
Ручной. Вам необходимо создать в директории /res проекта папки /drawable с квалификаторами нужной плотности, например для разрешения HDPI, указать соответственно квалификатор -hdpi: /res/drawable-hdpi (полный список возможных квалификаторов указан в таблице). В эту папку поместить изображение для указанной плотности с ТАКИМ ЖЕ ИМЕНЕМ файла, структура папок примет следующий вид:
res/drawable/ image1.png res/drawable-hdpi/ image1.png res/drawable-xhdpi/ image1.png
При запуске программы на конкретном устройстве, система определит, какая плотность пикселей у этого устройства и будет использовать изображение из папки с соответствующим квалификатором. При отсутствии подходящего квалификатора будет выбран ресурс с наиболее близко подходящим значением плотности или из папки /res/drawable/, если ничего более лучшего не найдется (никакие квалификаторы плотности не указаны). При сборке проекта IDE сгенерирует файл ресурсов R, в котором будут указаны ссылки на все ресурсы проекта. Обращаться к вашему изображению из кода следует следующим образом:
R.drawable.image1
Система сама подберет наиболее подходящий вариант для текущего устройства.
Автоматический. В IDE Android Studio имеется инструмент для автоматической подготовки изображений под разные плотности экрана.
Кликаете на папке res/ проекта и следуете: New -> Image Asset. Откроется инструмент Asset Studio, в котором вам необходимо:
выбрать тип подготавливаемого изображения (иконка для приложения, экшенбара или нотификации). указать файл изображения, из которого следует подготовить набор под нужные плотности (чекбокс Image), либо выбрать из дефолтных изображений (чекбокс Clipart) Указать имя, которое получит ресурс в проекте. Так же вы можете задать паддинги, обрезку и форму подложки (квадрат, круг и тд.)

Нажав кнопку Next мастера, вы перейдете на следующий экран, где необходимо выбрать, какие создавать папки для отдельных плотностей - выделяйте нужные вам папки с помощью левого клика с зажатой кнопкой Ctrl (Shift). Нажав кнопку Finish мастера будут автоматически подготовлены изображения для указанных плотностей, создана необходимая структура папок и в них размещены соответствующие изображения.
Недостаток этого инструмента в том, что нельзя так обработать произвольное изображение. Работает только для указанных типов иконок и создает файлы только соответствующего этим иконкам размера, например для иконки приложения под плотность HDPI будет создано изображение, размером 72х72 пикселей.
Так же смотрите эти ответы по смежным вопросам: ответ1 и ответ2

Форматирование текста в документации к Java методам/классам - отображение дженериков

Дано:
Пытаюсь добаваить к описанию класса в конструкции
/** * */
строку
ArrayList
но отображается (как и тут, в цитате):
ArrayList
Пробовал эти варианты:
Экранирование
ArrayList<\String>
получилось:
ArrayList\String>
Больше экранирования:
ArrayList\<\String>
получилось:
ArrayList\ \String>
Оборачивание тегом
ArrayList
ничего не выходит:
ArrayList


Ответ

Старый метод: ArrayList<String>.
Современный поход (начиная с JDK 1.5): использовать теги @literal или @code
при этом надо обернуть тег и его содержимое фигурными скобками
При использовании первого тега содержимое внутри не будет рассматриваться как HTML разметка (например, удобно для описания математических выражений). Второй тег используется для обертки кода.

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

Как выбрать номера телефонов (Phone) в которых сумма первых трех цифр равна сумме последних трех? Номер состоит из 6 цифр.


Ответ

select Phone from Table1 where (Phone % 1000) = (Phone - (Phone % 1000)) / 1000

Многопоточная обработка файлов с использованием ExecutorService

Как сделать чтобы один поток подсчитывал количество строк в одном файле, второй во втором и т.д.?
public class ThreadMain { static ArrayList FilesFind = new ArrayList<>();
public static void main(String[] args) {
String mask; Scanner DIR_NAME = new Scanner(System.in); Scanner MASK_NAME = new Scanner(System.in);
System.out.println("Введите директорию :"); getFilesList(DIR_NAME.nextLine());
System.out.println("Введите маску для поиска"); mask = MASK_NAME.nextLine();
System.out.println("Результат поиска :");
ExecutorService executor = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { Runnable worker = new ThreadPools(FilesFind, mask); executor.execute(worker); } executor.shutdown(); while (!executor.isTerminated()) { } System.out.println("Потоки закончили работу"); }
public static void getFilesList(String nameDirectory) { File f = new File(nameDirectory); for (File str : f.listFiles()) { if (str.isFile()) { FilesFind.add(str); } else if (str.isDirectory()) { getFilesList(str.getAbsolutePath()); } } } }
Класс ThreadPools
class ThreadPools implements Runnable {
private ArrayList FilesFindThread; private String maskThread; private String search;
ThreadPools(ArrayList FilesFind, String mask) { this.FilesFindThread = FilesFind; this.maskThread = mask; }
@Override public void run() { CountStrings(); }
public void CountStrings() { for (File fill : FilesFindThread) { try { BufferedReader reader = new BufferedReader(new FileReader(fill)); int count = 0; while ((search = reader.readLine()) != null) { if (search.contains(maskThread) && !search.isEmpty()) { count++; } } reader.close(); System.out.println(Thread.currentThread().getName() + ":" + "Name files :" + fill.getName() + " ---- > " + count); } catch (java.io.IOException e) { System.out.println(e); } } } }


Ответ

Статический метод Executors.newFixedThreadPool предназначен для создания пула с фиксированным числом потоков (это число вы указываете в качестве параметра конструктора). Если количество задач будет больше числа доступных потоков, то они добавляются в очередь и извлекаются из нее по мере освобождения одного из потоков.
С помощью метода execute() мы запускаем выполнение определенной задачи (выполнение может начаться сразу или позже, см. выше).
Поскольку нам необходимо многопоточно обработать определенное число файлов, то просто добавляем их обработку в качестве очередной задачи, за все остальное уже отвечает ExecutorService
Для завершения выполнения пула потоков используем два метода:
shutdown() - сообщаем, что наш сервис больше не принимает никаких новых задач. awaitTermination() - блокирующий метод пока все задачи не будут выполнены, либо текущий поток не будет прерван, либо не будет достигнут указанный таймаут.
Далее привожу пример многопоточного чтения файлов и подсчет количества строк в них. Пояснил код комментариями. Пример легко сможете адаптировать под свою задачу, добавив более сложную логику по поиску файлов на основе фильтров.
Основной метод для получения исходного каталога и запуска обработки файлов:
try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // Считываем исходный каталог для поиска файлов. System.out.print("Введите исходную директорию для поиска файлов:"); final String directoryPath = reader.readLine(); reader.close();
File directory = new File(directoryPath); // Убедимся, что директория найдена и это реально директория, а не файл. if (directory.exists() && directory.isDirectory()) { processDirectory(directory); } else { System.out.println("Не удалось найти директорию по указанному пути."); } } catch (IOException e) { e.printStackTrace(); }
Метод processDirectory(File directory) для поиска файлов и их обработки:
private static void processDirectory(File directory) { // Получаем список доступных файлов в указанной директории. File[] files = directory.listFiles(); if (files == null) { System.out.println("Нет доступных файлов для обработки."); return; } else { System.out.println("Количество файлов для обработки: " + files.length); }
// Непосредственно многопоточная обработка файлов. ExecutorService service = Executors.newFixedThreadPool(10); for (final File f : files) { if (!f.isFile()) { continue; }
service.execute(new Runnable() { @Override public void run() { try (BufferedReader reader = new BufferedReader(new FileReader(f))) { int lines = 0; while (reader.readLine() != null) { ++lines; } System.out.println("Поток: " + Thread.currentThread().getName() + ". Файл: " + f.getName() + ". Количество строк: " + lines); } catch (IOException e) { e.printStackTrace(); } } }); } // Новые задачи более не принимаем, выполняем только оставшиеся. service.shutdown(); // Ждем завершения выполнения потоков не более 10 минут. try { service.awaitTermination(10, TimeUnit.MINUTES); } catch (InterruptedException e) { e.printStackTrace(); } }
Пример выполнения данного кода:
Введите исходную директорию для поиска файлов: C:\projects\FindCentroid\src\pro\parshinpn Количество файлов для обработки: 6 Поток: pool-1-thread-1. Файл: Cluster.java. Количество строк: 25 Поток: pool-1-thread-4. Файл: Point.java. Количество строк: 90 Поток: pool-1-thread-3. Файл: Graph.java. Количество строк: 120 Поток: pool-1-thread-2. Файл: Edge.java. Количество строк: 92 Поток: pool-1-thread-6. Файл: Vertex.java. Количество строк: 69 Поток: pool-1-thread-5. Файл: UnionFindStructure.java. Количество строк: 102

Как проверить соответствие имени файла маске?

Есть имя файла без пути и маска. Надо проверить, соответствует ли имя данной маске.
Маска может содержать:
? - означает 1 любой символ * - означает 0 или более любых символов любые другие символы означают сами себя


Ответ

Задачу можно решить следующим образом (порядок проверок менять нельзя):
bool check(char *s, char *p) { char *rs=0, *rp; while(1) if(*p=='*') rs=s, rp=++p; else if(!*s) return !*p; else if(*s==*p || *p=='?') ++s, ++p; else if(rs) s=++rs, p=rp; else return false; }
Используемые переменные:
s (string) - указатель на проверяемую строку (имя файла). В процессе сравнения сдвигается на проверяемый символ строки (префикс до него уже проверен). p (pattern) - шаблон, с которым сверяется строка s. В процессе работы сдвигается на проверяемый символ шаблона (префикс до него проверен). rs (return in string) и rp (return in pattern) - куда надо откатиться в строке и шаблоне. rp ссылается на последнюю проверенную *, rs на часть строки, которую эта звёздочка уже поглотила.
Обоснование алгоритма:
Единственный символ шаблона, которому может соответствовать пустая строка в имени - это *, поэтому эта проверка должна быть первой. Если в шаблоне встретилась *, то мы можем заменить её на подстроку любой длины (от 0 до длины всей оставшейся части строки). Будем перебирать все варианты в порядке увеличения длины, т. е. пропускать на 1 символ больше после каждой неудачи. Если в шаблоне есть несколько *, то при неудаче достаточно возврата к последней. Увеличение числа пропускаемых символов у более ранней * не может улучшить результат, т. к. подстрока между * уже соответствует участку шаблона, при этом величина сдвига уменьшиться не может, а её увеличение возможно и за счёт последней * Если строка закончилась, то это означает конец проверки. Результат соответствует тому, достигнут ли конец шаблона. Это объясняется тем, что единственный символ шаблона, который может что-то изменить - это *. Однако, количество пропущенных символов уменьшить нельзя, а его увеличение не сможет изменить результат (конец строки будет достигнут ещё раньше). Кроме того, в шаблоне не могут остаться только *, т. к. проверка конца строки делается после проверки на * в шаблоне.
PS: Этот алгоритм используется с 2010 года в Ureal Commander'е.

Номер недели по текущей дате

Чтобы определить номер текущей недели в php достаточно одной строчки
date("W", time());
Как сделать тоже самое на перле? Нашел только пару примеров на несколько строк. Неужели нельзя как-то проще.


Ответ

perl -MTime::Piece -E '$t = localtime; say $t->week' 3

Как выполнить make, находясь в другой дирректории?

Возможно ли это? Не хочу тратить время на выход из vim, команду cd. Также не хочу держать открытыми несколько окон.


Ответ

Ключи: -C КАТАЛОГ, --directory=КАТАЛОГ Перейти в КАТАЛОГ перед выполнением действий.
make -C /путь/к/каталогу

Замена TextBlock на TextBox

Подскажите способ редактирования в RunTime.
У меня есть TextBlock на форме WPF. По нажатии кнопки "Редактирование", хотелось бы что-бы это поле (TextBlock), можно было бы редактировать. Как лучше поступить?


Ответ

Вариантов множество:
Изначально размещать TextBox, а не TextBlock, но блокировать редактирование (устанавливать ReadOnly/Enabled в false) Вместе с TextBlock размещать сразу TextBox и управлять их видимостью. Другой пример
Воспользоваться кастомным TextBlock, который разрешает редактирование: раз, два

Возможно ли сделать символ большим, не увеличив при этом пустое пространство внутри контейнера?

Пытаюсь максимально простыми средствами сделать некую круглую "лампочку", для этого в коде страницы написал •, а в CSS создал стиль .lamp {font-size:300%;}. Проблема в том, что чем больше становится "лампочка", тем больше "раздувается" ее контейнер, плюс съезжает вертикальная ориентация с соседним текстом. Как лучше всего сделать подобный трюк?
Картинка http://puu.sh/mNKim/99011932b4.png


Ответ

Достаточно задать высоту линии.
.lamp { font-size: 16px; line-height: 16px; }
"Раздувает" именно line-height, корректировать нужно его.

Как создать кратчайшую строку из строк?

Необходимо создать кратчайшую строку, которая содержит в себе все строки из массива. Пример ниже.
Массив строк: 000, 001, 100, 011
Кратчайшая строка, которая содержит все предыдущие строки: 100011
Интересен сам алгоритм, нежели чем реализация.


Ответ

Эта задача относится к сложным как в реализации так и в скорости задачам. Она может быть решена с помощью модернизированного алгоритма Ахо-Корасик http://e-maxx.ru/algo/aho_corasick . Конкретные детали реализации там же в предпоследнем абзаце (Нахождение кратчайшей строки, содержащей вхождения одновременно всех образцов) .
Важно! сложность будет порядка 2^n где n - количество строк.
Может искать эту задачу по запросу shortest common superstring она NP-полная.

Как доставляется электронная почта?

Я вот не совсем понимаю, как идет доставка сообщений на почтовый сервер? Мы пишем письмо с user@gmail.com на test@mail.ru. Что происходит на уровне системы? sendmail (или другой мейл агент) доставляет письмо на указанный сервер (mail.ru) или на другой (который прописан в mx-записи)? И самое главное - какому сервису он передается? sendmail-sendmail? Pop3 и imap служат только для того чтобы отдавать почту пользователю? В общем сильно не пинайте, а объясните концепцию или линк на толковую статью. Спасибо.


Ответ

Предположим, мы написали письмо со своего ящика user@gmail.com для test@mail.ru. Из веб-формы письмо передаётся MTA (Mail Transfer Agent - почтовый агент) Google, который начинает его обработку. MTA может быть любым - sendmail, postfix, MS Exchange и т.п., порядок действий везде одинаковый.
Вначале MTA выделяет из адреса отправителя имя домена (в нашем случае - mail.ru) и посылает DNS-запрос "какие MX-записи у этого домена?". Дело в том, что для почты есть свои собственные записи в DNS, так называемые MX-записи (MX - Mail Exchanger), в которых находятся имена (не IP-адреса, а именно имена почтовых серверов домена!). В ответ DNS присылает список имён почтовых серверов. MTA берёт один из полученных имён и посылает DNS-запрос "какой IP у этого имени?". DNS-сервер присылает в ответ адрес (возможно, не один) для имени, после чего MTA соединяется с этим адресом и по стандарному протоколу SMTP (или ESMTP) передаёт письмо почтовому серверу получателя. Сервер получателя кладёт письмо в своё внутреннее хранилище писем для test@mail.ru и ждёт пока пользователь подключится и прочитает свою почту.
Пользователь может не использовать web-интерфейс, а подключаться к MTA при помощи отдельной программы - почтового клиента (Mozilla Thunderbird, The Bat и т.п.). Но всё дело в том, что протокол SMTP для этого не подходит, он создан для обмена данными между серверами. Здесь работают два других протокола - POP3 и IMAP. Для клиента разница между ними почти отсутствует, но внутренне они абсолютно непохожи. IMAP более современный и умный, POP3 более старый и поглупее. (Если есть возможность - выставляйте IMAP.) Эти протоколы ответственны за передачу почты между клиентской программой и MTA. Если SMTP однонаправленный (только отправка), то клиентские протоколы двунаправленные (отправка и получение).
Есть ещё одна интересная деталь. MX-записей у домена может быть несколько. То есть у домена может быть несколько почтовых серверов. Казалось бы зачем это надо? Ведь у любого DNS-имени может быть несколько IP-адресов (A-записей), так зачем же усложнять картину? А затем, что у MX-записей есть то, чего нет у A-записей - приоритет. Все IP для одного имени равноприоритетны, но для MX-записей можно указывать их "вес". "Вес" - это неотрицательное целое число и чем оно меньше, тем выше приоритет этой записи. MTA всегда вначале пытается соединиться с сервером, имеющим более высокий приоритет и только если ему это не удалось, переходит к серверу с более низким приоритетом.

Как связать TextBox.Text с свойством другого объекта (binding)

Мне нужно в одном TextBox связать его свйоство Text с одним свойством из Settings. Т.е. при изменении TextBox.Text должно меняться поле в Settings и наоборот. Знаю точно что можно при помощи Binding'а сделать, однако... похоже настолько туп, что не могу найти элементарный гайд по байндингу. Пожалуйста, напишите простейший пример на основе моей задачи, только без наворотов, что-бы понять можно было даже мне :)


Ответ

Всё просто.
Если пространство имён по умолчанию вашего приложения — MyApp, ваши настройки обычно находятся в пространстве имён MyApp.Settings. Вам по идее нужен объект MyApp.Settings.Default. Пускай свойство называется NumberOfDragons. Тогда делаем вот как:

Что это означает?
Мы определили пространство имён settings для XAML, чтобы оно ссылалось туда, где лежат ваши Settings Мы в Binding'е указали объект, к которому происходит привязка: Source={x:Static settings:Settings.Default}. Это означает, что мы вызываем статический метод Settings.Default, и работаем с тем, что получили из него. (Source задаёт объект, к свойству которого мы привязываемся.) Указываем само свойство: Path=NumberOfDragons. (Path задаёт свойство объекта, к которому мы привязываемся.)
Всё!
Не забудьте в конце работы приложения сказать Settings.Default.Save();

В принципе, вы выбрали не самый лёгкий объект для Binding'а. Обычно привязываются не к какому-то статическому объекту, а к DataContext, в этом случае вам не надо указывать Source, оно подразумевается.
Ну и имя параметра Path (только этого параметра!) можно не указывать:


По поводу всяких продвинутых параметров Binding, вот есть краткая сводка (на английском): Шпаргалка по WPF Binding

Как из приложения отправить что-либо на принтер?

Как из консольного приложения или приложения WinForms отправить что-либо на принтер?


Ответ

Минимально необходимо для печати:
using System.Drawing.Printing; using System.Drawing;
void Print() { PrintDocument printDoc = new PrintDocument(); printDoc.PrintPage += PrintPageHandler; printDoc.Print(); }
void PrintPageHandler(object sender, PrintPageEventArgs e) { //Замените на e.Graphics.DrawImage или любую другую логику e.Graphics.DrawString("Привет", new Font("Arial", 14), Brushes.Black, 0, 0); }
при этом печать будет на дефолтном принтере. PrintDialog позволяет выбрать принтер и настроить некоторые параметры PrintDocument через диалоговое окно, но за печать отвечает именно PrintDocument
Расширим пример для использования PrintDialog
PrintDocument printDoc = new PrintDocument(); printDoc.PrintPage += PrintPageHandler; PrintDialog printDialog = new PrintDialog(); printDialog.Document = printDoc; if (printDialog.ShowDialog() == DialogResult.OK) printDialog.Document.Print();
Убираем всплывающие окошки, если в них нет необходимости:
printDoc.PrintController = new StandardPrintController();
По аналогии с добавлением PrintDialog, можно добавить PageSetupDialog и PrintPreviewDialog последовательно передавая им объект PrintDocument

Преобразовать дату и время к традиционному виду для локали

В android.
Как преобразовать дату и время к традиционному виду для локали?
DateFormat.getDateInstance(DateFormat.LONG).format(new Date()) // Вывод: "08 февраля 2016г." // Нужно например: "08 февраля 2016г. 10:25:17"
Необходимо получить еще и время. Вариант
(new SimpleDateFormat("dd.MM.yyyy hh:mm:ss")).format(new Date())
не предлагать, т.к. подходит не для всех локалей.


Ответ

Если бы вы хоть одним глазом посмотрели в документацию, то знали бы, что если вы замените DateFormat.getDateInstance(DateFormat.LONG) на DateFormat.getDateTimeInstance(), то получите это:
Dec 31, 1969 4:00:00 PM

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

В самоучителе по C++ столкнулся с термином блок трансляции (в разделе в котором написано про using директиву), подскажите что это может быть?


Ответ

Перед компиляцией по вашим исходникам проходится препроцессор и создает один или несколько текстовых файлов, которые собственно и будут преобразованы компилятором в obj файлы. Каждый из таких файлов и является блоком трансляции. В каждый из них попадает как минимум один из файлов исходного кода, "корневой", и все включенные в него файлы.

LINQ, динамическое формирование запроса в зависимости от количества фильтров поиска

Имею 6 значений по которым необходимо фильтровать данные:
дата с/ф номер с/ф поставщик получатель исполнитель тин компании

На стороне сервера получаю string[] с этими значениями. Если крыжик стоит над полем, то параметр участвует в фильтрации и наоборот. Как сформировать LINQ запрос который бы при отсутствии параметра в string[] не учитывал его в фильтрации данных и наоборот.
var MySelect = from q in MyDB ...???


Ответ

Примерно так:
var q = from row in ... ... select row; // Базовый запрос без фильтров
if (фильтр 1 установлен) q = q.Where(row => условие фильтра 1);
if (фильтр 2 установлен) q = q.Where(row => условие фильтра 2);
if (фильтр 3 установлен) q = q.Where(row => условие фильтра 3);
if (фильтр 4 установлен) q = q.Where(row => условие фильтра 4);
if (фильтр 5 установлен) q = q.Where(row => условие фильтра 5);
if (фильтр 6 установлен) q = q.Where(row => условие фильтра 6);
if (фильтр 7 установлен) q = q.Where(row => условие фильтра 7);

В чем смысл класса Permission в java

public class Worker {
private static String path;
public static void main(String[] argv) throws Exception { path = "C:\\glassfish-4.1.1\\glassfish4\\README.txt"; Permission permission = new FilePermission(path, "read"); try { AccessController.checkPermission(permission); }catch (Exception e){ System.out.printf(String.valueOf(e)); } System.out.println(new FileInputStream(new File(path)).read()); } }
Этот класс вернет что-то похожее на
java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\glassfish-4.1.1\glassfish4\README.txt" "read")84
Почему удалось прочитать из файла, когда прав на это нет!?


Ответ

Для ограничения доступа к файлам в файловой системе используются методы класса File
setExecutable() setReadable() setWritable()
Пример, который приводите вы, относится к настройке SecurityManager. Это механизм который позволяет ограничивать Java приложению доступ к определенным ресурсам (не только файлам). В качестве примера, возьмем апплеты - SecurityManager не дает им доступа к файловой системе.
Почувствуйте разницу - SecurityManager не модифицирует права файла в файловой системе, а запрещает Java приложению совершать с ним определенные действия. В этом и смысл класса Permission, и наследуемых от него классов - они описывают эти действия.
Файл у вас прочитался потому что в JDK, по умолчанию, SecurityManager отключен. Проверить это можно таким образом:
System.out.println(System.getSecurityManager()); // null, если отключен
Запустите приложение с ключом VM -Djava.security.manager и файл у вас прочитать не получится, до тех пор пока не будет настроена соответствующая security policy. Дефолтные лежат в $JAVA_HOME/lib/security
public static void main(String[] args) throws FileNotFoundException, IOException { System.out.println(System.getSecurityManager()); String path = "D:/test/file.txt"; check(path, "read,write"); System.out.println(new FileInputStream(new File(path)).read()); }
static void check(String path, String actions) { FilePermission perm = new FilePermission(path, actions);
try { AccessController.checkPermission(perm); } catch (Exception e) { System.out.println(e); } }
Подробнее смотрите в официальной документации

Как поменять иконку приложения?

Собственно вот цитата из документации:
First, put a single line of text to the myapp.rc file: IDI_ICON1 ICON DISCARDABLE "myappico.ico"
может я неправильно понимаю выражение single line, но файл .rc содержащий одну эту строку выдает ошибку
Start tag exepted
Помещение этого же выражение меж строк
IDI_ICON1 ICON DISCARDABLE "icon.ico"
Так же выдает ошибку:
Unexpected text
Так куда же вставить мне эту строку чтоб поменять иконку?
UPD: мой работающий файл ресурсов имеет вид:
... qml/main.qml ...
И попытки вставить строку в него так же провалились с теми же ошибками.
UPD: А вот как добавляю rc к проекту:
set(RESOURCES resources/resources.qrc resources/proj.rc )
qt5_add_resources (QRC_SOURCES ${RESOURCES})
...
add_executable( proj_name ... ${QRC_SOURCES} ...)
и пробовала просто новый projname.rc туда же добавить.


Ответ

Вот такого rc файла должно быть достаточно для иконки приложения:
0 ICON "myappico.ico"

Допустим, Ваш rc файл имеете имя resources.rc, тогда cmake код будет выглядеть так:
set(RESOURCES resources/resources.qrc )
qt5_add_resources (QRC_SOURCES ${RESOURCES})
...
add_executable( proj_name ... ${QRC_SOURCES} resources.rc ...)
resources.rc это специфичный для windows файл, поэтому его нужно напрямую с исходниками передавать в add_executable, для него не нужно и нельзя выполнять никакой предобработки.

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

Как можно установить дружественную связь между обычным классом и шаблоном класса?
Допустим у нас есть шаблон класса MyArray template class MyArray; и обычный класс ArrayEditor class ArrayEditor;
Каким образом я могу установить между ними дружественную связь (friend class)
Между классом ArrayEditor и всеми экземплярами шаблона MyArray? Между классом ArrayEditor и конкретным экземпляром (например int или string)?


Ответ

Между нешаблонным классом NotemplateClass и общим шаблоном класса TemplateClass
template class TemplateClass{};
class NotemplateClass { template friend class TemplateClass; };

Между нешаблонным классом NotemplateClass и явной специализацией шаблонного класса TemplateClass
template class TemplateClass{};
template <> class TemplateClass{};
class NotemplateClass { friend class TemplateClass; };

Как получить погодные данные от ближайшей погодной станции?

Добрый день! Подскажите, пожалуйста. Есть список погодных станций с заданными координатами широты и долготы:
KJKL KY Julian Carroll Airport 37.6 -83.32 http://weather.noaa.gov/weather/current/KJKL.html http://weather.gov/xml/current_obs/KJKL.rss http://weather.gov/xml/current_obs/KJKL.xml
KLEX KY Lexington, Blue Grass Airport 38.05 -84.6 http://weather.noaa.gov/weather/current/KLEX.html http://weather.gov/xml/current_obs/KLEX.rss http://weather.gov/xml/current_obs/KLEX.xml
...
и т.д. Их около полтысячи. Как мне определить ближайшую станцию по отношению к Андроид устройству? Я знаю, как сделать парсинг погоды, определить местонахождние для устройства(по формуле), сравнить с конкретной станцией. Но их там полтысячи! То есть нужно автоматически определить ближайшую станцию.


Ответ

Вам нужно:
Получить координаты устройства. Создать список/массив для хранения квадратного корня из суммы квадратов координат каждой станции по обеим осям относительно вашего положения. Отсортируйте полученный список от большего к меньшему. Теперь у вас в списке первый элемент - ближайшая станция.

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

Добрый день.
Есть 2 метода:
string GetStringDataFromDataRow(DataRow dr, string key) { //... код }
int GetIntegerDataFromDataRow(DataRow dr, string key) { //... код }
Оба они делают одно и тоже - из DataRow по имени колонки выбирают данные. Можно ли их как-то совместить в один метод?
Я вижу только один способ - сделать один метод GetDataFromDataRow, который возвращает String, а на месте потом ее конвертить в int.
Есть ли другой способ?


Ответ

Можно сделать Generic(шаблонный) метод
T GetDataFromDataRow(DataRow dr, string key) { //... код }
В этом случае, ожидаемый тип возвращаемого значения указывается непосредственно при вызове метода:
string stringData = GetDataFromDataRow(dr, key); int integerData = GetDataFromDataRow(dr, key);

Что за галочки и замки в Visual Studio?

Что за галочки и замки в Visual Studio напротив классов и не только?


Ответ

Это значки от подключенной в Visual Studio системы контроля версий -- скорее всего TFS или git. Они отображают текущее незафиксированное (т.е. не попавшее в репозиторий) состояние файла:
Замок означает, что файл не был изменен. Галочка означает, что файл был изменен. Плюсик (на скриншоте его нет, но такая иконка тоже существует) означает, что это новый файл.

Развертывание Rails приложения на хостинге

Как развернуть Rails приложение на VPS сервере? Нужно ли что-то дополнительно устанавливать на сервере, кроме самого Rails?
Что было сделано:
Установлен Rails на VPS Загружено на сервер нужное rails приложение После чего через консоль запустил само приложение cd appname , rails s
Как получить к нему доступ из вне? То есть через URL или IP адрес в браузере?


Ответ

В последних версиях Rails, где-то около 4.0 и выше — никак, потому что вебсервер вешается по умолчанию на localhost:3000 и принимает соединения только через "локальную петлю", от самого себя к самому себе. Для нужд разработки этого достаточно, да и в production-средах в большинстве случаев тоже (из-за балансировщика нагрузки; но тоже не всегда).
Надеюсь, вы уже заменили Webrick на что-то более серьёзное. Webrick написан на чистом Ruby и работает одним процессом в один поток. Он даже одного пользователя будет выдерживать с трудом.
Как правило, сервер приложения, запускаемый таким образом, не приспособлен для работы "лицом в интернет" (неэффективен, мало возможностей настройки), поэтому его разворачивают за прозрачным прокси (обычно nginx), который принимает соединения напрямую и обслуживает самостоятельно запросы на статические файлы, а остальное перенаправляет к серверу приложения
Тема достаточно обширная и гайдов на просторах интернета очень много, очень разного качества, и я не рискну писать ещё один здесь. Я изложу общий план действий, а их конкретную реализацию можно придумать и самостоятельно:
Заставить сервер приложения слушать сетевой адрес/порт, доступный локально (или адрес/порт с ограниченным доступом, или вовсе Unix domain socket) Поставить перед сервером приложения балансировщик нагпузки/прозрачный прокси и организовать раздачу статики (что сервер приложения обычно делает неэффективно)
Например, поставить nginx и сделать ему try_files на статику и proxy_pass на локальную точку, которую слушает сервер приложения Обеспечить выживание: воспользоваться любым решением, которое будет автоматически запускать приложение при запуске машины (чтобы после перезагрузки приложение запускалось без лишних движений), а также перезапускало его в случае падения.

Но это очень примитивный сценарий, который не для всех приложений подойдёт. Есть целый род деятельности по планированию и реализации инфраструктуры. Я совершенно никак не затронул:
Отслеживание признаков жизни сервера Сбор ошибок и уведомление о них разработчиков Резервные копии Процесс автоматического разворачивания
...а это всё весьма нужные вещи.

Есть также более весёлые варианты вроде сборки Docker-образа из приложения и запуск его в виде отдельного контейнера. Но итоговая система будет приблизительно такой же. Есть определённая свобода вроде "делать ли nginx отдельным контейнером".

Почему неправильно суммируется Double

У меня есть такая программа:
public class Main { public static void main(String[] args) { double nominal = 1.0; double sum = 0;
for (int i = 0; i < 10; i++) { sum += 0.1; System.out.println("sum = " + sum); }
if (nominal == sum) { System.out.println("Числа равны!"); } else { System.out.println("Числа не равны!"); } } }
По смыслу, результат сложения числа в цикле должен равняться 1, но результат выходит такой..:
sum = 0.1 sum = 0.2 sum = 0.30000000000000004 sum = 0.4 sum = 0.5 sum = 0.6 sum = 0.7 sum = 0.7999999999999999 sum = 0.8999999999999999 sum = 0.9999999999999999 Числа не равны!
Почему double суммируется не так, как нужно?


Ответ

Не все числа можно точно представить в виде double, таков стандарт вычислений с плавающей запятой - IEEE 754
Именно поэтому, для точных вычислений дробных чисел (деньги, единицы товара), применяют числа с фиксированной запятой, но никак не double или float
Числа с плавающей запятой прекрасно подходят для обработки научных расчетов и численного моделирования.
О сравнении чисел с плавающей запятой

Приведение строки к nullable int типу

Подскажите, можно ли без написания функций привести строку к ?int типу ?
Попытался найти решения, но в основном натыкался на самописные функции преобразования.
Неужели средствами самого C# нельзя выполнить подобные преобразования?


Ответ

Попробуйте int.Parse. Или int.TryParse, если строка имеет законное право быть не строковым представлением числа.
Скорее всего, вам понадобится вариант с указанием языка: int.Parse(s, CultureInfo.InvatiantCulture) или int.TryParse(s, NumberStyles.Integer, CultureInfo.InvatiantCulture, out result)
Для случая nullable-типа, если вам нужно получить null при ошибке преобразования, придётся-таки вручную:
int temp; int? result = int.TryParse(s, out temp) ? temp : default(int?);

Передача файла на сервер CURL

Пытаюсь передать файл на сервер, использую CURL
Запрос формируется так:
$postdata = array( 'FileToLoad' => "@".$this->file."; filename=\"$this->filename\";", 'fileId' => $this->fileId);
$this->file содержит полный путь до файла на сервере /var/www/site/data/www/site.ru/tmp/file.pdf
Отправляю так:
if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt($curl,CURLOPT_ENCODING, ''); curl_setopt($curl, CURLOPT_COOKIE, ".ASPXAUTH=$this->token;"); $out = curl_exec($curl); curl_close($curl); }
Запрос проходит успешно, но данные попадают в $_POST, а я их очень хочу увидеть в $_FILES. Где я ошибаюсь?


Ответ

Как выяснили в комментариях, речь о PHP 5.6. Начиная с этой версии загрузка файлов синтаксисом через @ отключена по-умолчанию. Теперь файлы нужно загружать через класс CURLFile, как-то так:
$postdata = array( 'FileToLoad' => new CURLFile($this->file, null /*или mime-type*/, $this->filename), 'fileId' => $this->fileId, );
Код самого запроса остаётся тем же самым.
Как видно, исправляется несложно. Но для полноты ответа добавлю, что для старого кода включить обратно передачу файлов через синтаксис @ пока возможно опцией CURLOPT_SAFE_UPLOAD

Как добавить к параметру +1 день?

Есть запрос:
declare @StartDate DateTime='2016-01-01', @EndDate DateTime='2016-02-29' BEGIN SET NOCOUNT ON; select id, ModifiedAt From Deals Where ModifiedAt between @StartDate and @EndDate END
Как сделать при интервалах даты '2016-01-01' по '2016-02-29' запрос выполнялся по 2016-01-01 по 2016-03-01? То есть нужно в Where добавить условия +1 Day


Ответ

С помощью функции dateadd
Where ModifiedAt between @StartDate and dateadd(day, 1, @EndDate)
Можно добавлять день, час, месяц, год, неделю и т.п. - это задаётся первым параметром. Второй параметр - сколько соответствующих интервалов добавить. Последний - то к чему добавлять. Замечу, что можно добавлять отрицательные величины.

Вижу, у вас это в процедуре с параметром, иногда удобнее прибавлять день к параметру перед вызовом процедуры (например, если происходит вызов из внешнего приложения), оставив в ней:
Where ModifiedAt between @StartDate and @EndDate
но, это конечно - как вам удобнее.
Да, и, для дат часто делают проверку интервала с нижней границей включённой, а верхней - исключенной, чтобы если сделка совершена ровно в промежутке, она не попадала в два интервала одновременно:
Where ModifiedAt >= @StartDate and ModifiedAt < @EndDate
T.е. если у нас допустим @StartDate = 2016-01-01 a @EndDate = 2016-03-01, то возьмутся записи с 2016-01-01 00:00:00.000 примерно по 2016-02-29 23:59:59

Как добавить один день к Date

Date departDate;
calendar.init(departDate, nextYear.getTime()) .withSelectedDate(dep);
У меня departDate может взять любую дату, то есть неизвестная у него дата, мне нужно добавить к нему один день. departDate + 1 никак не помогает.
Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, 1); Date dep1 = cal.getTime();
departDate + dep1 тоже не помогает.
Как в данном случае добавить один день и вообще как добавить день к Date???


Ответ

Вместо cal.add(Calendar.DAY_OF_MONTH, 1); используй метод cal.add(Calendar.DATE, 1);

NVL-функция в mysql

в бд есть поле типа Date yyyy-mm-dd, в оракле я mm получал с помощью такого кода
SELECT nvl(substr(column_name, 4, instr(column_name,'.')-1),column_name) FROM table
есть ли такое в MySql


Ответ

Функции EXTRACT, MONTH. sql-tutorial.ru/ru/book_datepart_function/page2.html - получение месяца. IFNULL - аналог NVL

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

Тестирую некоторый алгоритм. Данные для алгоритма хранятся в списке. В итоге у меня получается вот так:
@Test public void testOneDirectModeBestCaseEven(){ list.add(new Agent(6)); list.add(new Agent(1)); list.add(new Agent(2)); list.add(new Agent(3)); list.add(new Agent(4)); list.add(new Agent(5));
int i = 0; while(!list.hasSolution()){ LeaderElection.solve(list, i++); }
int leaderId = list.getLeaderId(); assertEquals(6, leaderId); }
@Test public void testOneDirectModeBestCaseOdd(){ list.add(new Agent(5)); list.add(new Agent(1)); list.add(new Agent(2)); list.add(new Agent(3)); list.add(new Agent(4));
int i = 0; while(!list.hasSolution()){ LeaderElection.solve(list, i++); }
int leaderId = list.getLeaderId(); assertEquals(5, leaderId); }
И еще много функций. Получается дублирование в том что я заполняю List в каждом тесте. Но и в setUp не вынесешь, потому что заполнять то нужно по-разному для каждого теста.


Ответ

Вам могут помочь параметризованные тесты. JUnit их тоже поддерживает. Приведу код, подробнее почитать можете по ссылкам. (На джаве давно не писал, поэтому скорее всего тут есть ошибки компиляции :))
@RunWith(Parameterized.class) public class LeaderElectionTests{
@Parameters public static Collection data(){ return Arrays.asList(new Object[][]{ { <список 1>, <ответ 1> }, { <список 2>, <ответ 2> } }); }
private List list; private int expected;
public LeaderElectionTests(List list, int expected){ list = input; expected = expected; }
@Test public void testOneDirectModeBestCase(){ int i = 0; while(!list.hasSolution()){ LeaderElection.solve(list, i++); }
int leaderId = list.getLeaderId(); assertEquals(answer, leaderId); } }
Однако такой подход нужно использовать только когда вы тестируете один кейс на разных наборах входных данных. Если же у вас разные кейсы, причем эта разница заложена непосредственно во входных данных, то я бы рекомендовал идти по пути отдельных тестов. Это проще для восприятия, потому что так или иначе в названия тестов мы закладываем наши решения и наш опыт, полученные в процессе написания кода. Глядя же на обезличенный список тестовых наборов данных, через месяц уже будет сложно сказать, чем они отличаются между собой.
Судя по коду, ваш объект list -- не просто список, он еще содержит в себе некоторую логику. Так что скорее всего разумнее будет остаться с разными тестами и дублирующимися данными, которые на самом деле не дублирующие данные, а разные тест кейсы. Хотя вам должно быть виднее, конечно.

В чём разница между определением, объявлением, реализацией и инициализацией?

В чём разница между определением, объявлением, реализацией и инициализацией?


Ответ

Если совсем кратко:
typedef int MyType; // объявление синонима типа
extern int value; // объявление переменной int value; // объявление + определение посредством неявной инициализации int value2 = 0; // объявление + определение посредством явной инициализации значением 0
int func(); // объявление функции (прототип функции) int func(){ return 0; } // определение функции посредством реализации
class SomeClass; // объявление класса class SomeClass // определение класса { static int field; }; // объявление static члена класса int SomeClass::field = 0; // определение static члена класса посредством инициализации значением 0

Явная и неявная инициализация переменных
Если при определении переменной не происходит явного присвоения ей какого-либо значения (т.е. не происходит явной инициализации), то компилятор может проинициализировать её сам в соответствии со следующими правилами:
переменные со статическим временем существования (глобальные, в пространствах имен и статические) инициализируются нулем автоматические переменные не инициализируются (т.е. имеют случайное значение той области стека, которую компилятор выделил под переменную) динаммические переменные не инициализируются (т.е. имеют случайное значение той области памяти, которая была выделена под объект в куче)
Стоит заметить, что в большинстве реализаций в debug-версии под автоматические переменные область стека заполняется значениями 0xCCCCCCCC, а область heap (кучи) заполняется 0xCDCDCDCD, что может позволить при отладке выявлять использование неинициализированных переменных.

Объявление и определение
Стоит заметить, что объявлений может быть сколь угодно много, а определение лишь одно (за исключением inline функций, которые при этом не нарушают ODR).

Освобождение памяти в структуре

Когда читал про выделение памяти с помощью new и ее освобождения, возник вопрос. Вот пример кода:
const int size_m = 40;
int main () { struct car { char *name; };
int QCar; cout << "How many car?"; cin >> QCar; car *pCar = new car[QCar]; for ( int i = 0; i < QCar; i++) { cout << "Car name: "; char temp [size_m]; char >> temp; char *ptemp = new char [strlen(temp)+1]; strcpy(ptemp,temp); pCar[i].name = ptemp; } cout << " Your auto"<< endl; for ( int i = 0; i < QCar; i++) { cout << pCar[i].name; } delete []pCar; system("pause"); return 0; }
Является ли достаточным только это освобождение или нужно еще. Или вообще иначе. Просто выделение памяти дважды , а удаление одно.


Ответ

Почти правильно :) Сейчас поясню, почему "почти".
В C++ у каждого объекта есть такая вешь, как конструктор и деструктор. Если их не написать самому - их сгенерирует компилятор (все несколько сложнее, но я упрощаю как только могу). Деструктор вызывается при уничтожении объекта, так что вот тут
delete []pCar;
он будет вызван. Но вы не написали свой деструктор, а генерируемый понятия не имеет, что делать с name и потому не делает ничего. Так что надо дописать свой деструктор -
struct car { char *name; ~car() { delete[]name; } };
В таком случае будет достаточно написать ваш delete []pCar; - и все будет корректно. Почти. Почему почти? потому что а вдруг вы забудете инициализировать name? И он будет показывать непонятно куда, а при удалении непонятно чего произойти может все, что угодно. Поэтому давайте допишем конструктор
car(): name(nullptr) {}
И все бы ничего, но ведь кто-то может (может, даже вы) написать где-то pCar->name = "ПЦ". И при попытке освобождения будут неприятности. Поэтому лучше делать не структуру, а класс:
struct car { public: car(): name(nullptr) {} ~car() { delete[]name; } private: char *name; };
Готово? Почти. Потому что надо еще как-то теперь заставить name хранить строку. Опять же, делаем конструктор
car(const char * str):name(nullptr) { if (str) { name = new char[strlen(str)+1]; strcpy(name,str); } }
и функцию-член для обращения к этой строке:
const char* str() const { return name; }
и оператор присваивания, чтоб name менять:
car& operator=(const char * str) { delete[]name; if (str) { name = new char[strlen(str)+1]; strcpy(name,str); } else name = nullptr; }
Вот теперь можно считать готово. Можно дописать еще многое, но главное - уже на месте:
struct car { public: car(const char * str = nullptr):name(nullptr) { if (str) { name = new char[strlen(str)+1]; strcpy(name,str); } } ~car() { delete[]name; } const char str() const { return name; } car& operator=(const char * str) { delete[]name; if (str) { name = new char[strlen(str)+1]; strcpy(name,str); } else name = nullptr; } private: char *name; };
А ваш код превращается в
car *pCar = new car[QCar]; for ( int i = 0; i < QCar; i++) { cout << "Car name: "; char temp [size_m]; char >> temp; pCar[i] = temp; } cout << " Your auto"<< endl; for ( int i = 0; i < QCar; i++) { cout << pCar[i].str(); } delete []pCar;
Примерно так - но только для начала :)

Вытащить класс из коллекции типа абстрактного класса

Всем привет !
Каким образом можно вытащить класс из коллекции (на примере)
Имеется абстрактный класс Игрок
public Player(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; }
Имеется класс Вратарь
public GoalKeeper(String firstName, String lastName, int age, int handling, int aerialAbility) { super(firstName, lastName, age); this.handling = handling; this.aerialAbility = aerialAbility; }
Позже я создаю объект и помещаю его в коллекцию типа Игрок (абстрактный класс)
players = new ArrayList();
players.add(new GoalKeeper("Олег", "Газманов", 11, 44, 35));
Каким образом я могу из этой коллекции вытащить данные класса Вратарь ? Спасибо !


Ответ

Необходимо проверить и привести тип:
Player player = players.get(0); //или другой индекс if (player instanceof GoalKeeper) { GoalKeeper goalKeeper = (GoalKeeper) player; //... }

Как проще всего сымитировать репозиторий (данные)

У меня есть интерфейс репозитория, например:
public interface IUserRepository { IEnumerable ListUsers(); User GetUserById(int id); void AddUser(User user); void DeleteUser(User user); void EditUser(User user); }
где User, например, выглядит так:
public class User { public int Id { get; set; } public string Name { get; set; } public IEnumerable { get; set; } public string Email { get; set; } }
на всякий случай,
public class Role { public int Id { get; set; } public string Name { get; set; } }
Как проще всего сделать имитацию данного репозитория с фейковыми данными?
Если просто сделать singleton внутри которого определить List, то это меня смущает, потому что будут отличия в поведении от реального репозитория. Если в реальном репозиторие два раза сделать GetUser(id) (с одним и тем же id), то получим два экземпляра объекта. А если в singleton-е или статическом классе так же будем 2 раза доставать из List<>, то получаем один экземпляр объекта. Если делать Text File или XML, то вроде как долго. Хотелось бы максимально простой вариант найти. Но если это самый простой вариант, то скажите, тогда сам отвечу, что получилось. Что касается SQLite, то тем более городить долго, не стоит того. Если использовать Моки, то смущает, что у меня почти нет с ними опыта работы, и то, что данные (например, имя, Email) будут выглядеть не красиво. Кажется, в моей ситуации проще самому ввести как-то данные для 5-10 пользоватей.
UPDATE: Сохранять состояние достаточно в рамках одного сеанса работы программы. После ее выключения, можно сбрасывать добавленных или измененных User-ов


Ответ

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

Объединение двух массивов в C# (заданное количество элементов)

Есть два массива list1 и list2. При помощи LINQ нужно получить массив list3 состоящий из заданного кол. элементов из list1 и заданного кол. элементов из list2


Ответ

Воспользуйтесь функциями:
Concat(), которая объединяет две последовательности в одну. Take(), которая позволяет вернуть первые N элементов из последовательности
Например
var list1 = new List() { "1", "2", "3", "4", "5", "6", "7" };
var list2 = new List() { "1", "2", "3", "4", "5", "6", "7" };
var list3 = list1.Take(5).Concat(list2.Take(3));
В итоге list3 будет содержать 5 элементов из первого списка, и 3 - из второго
"1", "2", "3", "4", "5", "1", "2", "3"
Если вы хотите из списков брать не первые элементы, а 'элементы где-нибудь из середины списка, то тогда вам в помощь функция Skip(), которая позволяет пропустить N количество элементов с начала последовательности
var list3 = list1.Skip(2).Take(5).Concat(list2.Take(3));
Результат в list3
"3", "4", "5", "6", "7", "1", "2", "3"

Выделение текущего выбранного файла в папках проекта в sublime?

Как настроить, чтобы при клике на дерево файлов и каталогов проекта (слева), текущий выбранный файл как либо выделялся в дереве?


Ответ

Нажмите правой кнопкой мыши в основной области, и в контекстном меню выберите пункт Reveal in Side Bar, текущий файл будет подсвечен в дереве файлов и каталогов.

VBA и SQL. Разделение таблицы

Имеется таблица с полями a, b, c, d. Тип полей заранее неизвестен. Необходимо создать новую таблицу и скопировать туда поле с и соединить его с полем с в исходной таблице.
Среда программирования: MS VBA 7.1
СУБД: Microsoft Access 2013


Ответ

Проще сделать так:
SELECT c Into new_table from Old_table;
Таблица создается на лету.

как правильно переопределить метод SetValueAt()?

при переопределении данного метода выдается ошибка:
The left-hand side of an assignment must be a variable.
Как ее убрать?
Фрагмент кода программы :
public class AbstrTableModel extends AbstractTableModel {
HashMap hashMap; public static int key = 0; private File fin; private Scanner fileScanner;
public AbstrTableModel(){ AbstrTableModel.key = 0; hashMap = new HashMap(); }
//-------------------------------------
@Override public void setValueAt(Object value, int rowIndex, int columnIndex){ switch(columnIndex){ case 1: hashMap.get(rowIndex).setModel() = (String)value; return; case 2: hashMap.get(rowIndex).setRazmer() = (Double)value; return; case 3: hashMap.get(rowIndex).setTip_displeya()= (String)value; return; case 4: hashMap.get(rowIndex).setVmFlash()= (Integer)value; return; } } }


Ответ

Ошибка значит - "в левой части оператора присваивания должна быть переменная".
Вы не можете использовать конструкцию hashMap.get(rowIndex).setModel() в левой части операции присваивания. Если setModel() -метод-сеттер, то он и должен устанавливать какое то значение через свой аргумент.

Многопоточность для обработки файла

Есть много огромныйх файлов(по 4-6gb), мне нужно запустить примерно 100 потоков, чтобы каждый поток брал следующую строку из файла и обрабатывал.
List _threads; int countThr;
public void Run(int count) { Globals.threadAlive = 0; _threads = new List(); _threads.Clear(); countThr = count; for (int i = 0; i < count; i++) { var thread = new Thread(multiThread); thread.IsBackground = true; _threads.Add(thread); _threads[i].Start(); } }
public void Abort() { Globals.threadAlive = 1; foreach (Thread thr in _threads) { thr.Abort(); } _threads.Clear(); Globals.threadAlive = 0; }
private void multiThread() { for (int c = 0; c < Globals.lines.Length; c++) { //обработка строки } Globals.threadAlive = 1; Abort(); }
Это будет правильное решение моей задачи?


Ответ

Я предлагаю вычитывать с помощью File.ReadLines, это позволяет не загружать весь файл в память.
Разбирать отдельные строки в отдельных задачах для потоков - нерентабельно, скорее всего, зависит от того, как долго занимает обработка одной строки.
Поэтому предложенный вариант разбивает все строки на пакеты небольшого размера (batches) и обрабатывает их параллельно.
void Main() { var filePath = Path.GetTempFileName(); File.WriteAllText(filePath, string.Join(Environment.NewLine, Enumerable.Range(0, 100001)));
var batchSize = 1000;
var allLines = File.ReadLines(filePath);
var processedCount = 0;
GetLinesInBatches(allLines, batchSize).AsParallel().ForAll(batch => { foreach (var line in batch) { Interlocked.Increment(ref processedCount); // Do something with the line. } });
Console.WriteLine("Total: {0}", processedCount); }
IEnumerable> GetLinesInBatches(IEnumerable allLines, int batchSize) { using (var e = allLines.GetEnumerator()) { bool more = false; do { var batch = new List(batchSize); for (var i = 0; i < batchSize && (more = e.MoveNext()); i++) { batch.Add(e.Current); } yield return batch; } while (more); } }

Скалярное произведение векторов, SSE

Помогите с примером скалярного произведения двух векторов, заданных массивами типа double, при помощи SSE инструкций. Все найденные мной примеры почему-то написаны для типа float Например, вот такая функция
float inner(int n, float* x, float* y) { __m128 *xx = (__m128*)x; __m128 *yy = (__m128*)y; __m128 s = _mm_setzero_ps();
for(int i=0; i

Ответ

А здесь ничего сложного нет. Просто нужно поменять команды на другие. Double вдвое больше по размеру, чем float, поэтому цикл нужно вести до n/2, а не до n/4, далее, ищите справочник и команды работы с double. Например, _mm_mul_pd - это умножение double, аналогично, скорее всего, _mm_add_pd будет для сложения. Аналогично можно отыскать в гугле остальные команды, у меня на это ушло 5 минут.
UPD: лучше после цикла не делать эту ерунду, что написана в примере, а лучше командой _mm_store_pd сохранить два double из xmm регистра в две переменные и спокойно вернуть их сумму.

Makefile для отдельных каталогов src и bin

Существует дерево файлов:
folder |-src |-myfile.cpp |-myfile.h |-bin |-Makefile
Хочу написать Makefile так, чтобы компилировались файлы, находящиеся в каталоге src, но объектные файлы создавались в текущем (в folder). А потом, чтобы они линковались в один файл в каталог bin.
На данный момент имею нерабочий Makefile. Ругается на отсутствие правила для myfile.o.
TARGET=myfile OBJECTS=myfile.o XX=g++ CXXFLAGS=-std=c++11
all: ${TARGET} ${TARGET}: ${OBJECTS} ${XX} -o ${TARGET} ${OBJECTS} .c.o: ${XX} ${CXXFLAGS} -c "${INCLUDE}$<" -o "$@"
Как правильно реализовать поставленную задачу?


Ответ

чтобы они линковались в один файл в каталог bin
значит, собирать вам надо не myfile, а bin/myfile. это я про переменную TARGET
объектные файлы создавались в текущем
так и укажите цель и пререквизиты соответствующим образом:
%.o: src/%.cpp $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $(OUTPUT_OPTION) $<
здесь вторая строка, рецепт, взята из implicit rules, которые можно посмотреть в выводе команды make -p

остаётся только объяснить компилятору, где искать заголовочный файл myfile.h (если, конечно, компилятор сам не «догадается»). тут я, как не-программист, вряд ли чем помогу. разве что предположу, что надо добавить к значению перменной CPPFLAGS или CXXFLAGS опцию -I src

Как рассчитать радиус?

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

Когда я поверну угол на 90 градусов вокруг точки O, то отрезок CA займет место отрезка AB.
Теперь представьте что угол 45 градусов.

Как мне найти длину радиуса OE чтобы отложив от отрезка AB перпендикуляр равной длины, я нашел точку, повернув угол вокруг которой на 45 градусов я поместил отрезок CA в положение AB?


Ответ

Если я правильно понял условие, то точку O надо поместить в точку пересечения биссектрисы угла BAC и срединного перпендикуляра к отрезку AB.
В общем, равнобедренный треугольник AOB с основанием AB, угол OAB равен половине угла BAC. Надо найти высоту. Для этого есть несколько способов разной сложности.

Обнаружение зон при использовании порога

Имею изображение после использования порога: Вопрос в обнаружении белых зон: 1) Используя многоугольник (который рисует пользователь (хотелось бы еще узнать как рисовать на Mat)) и узнавать процент закрашенности внутри этой зоны 2) Автоматически (рисуя вокруг зон квадраты) Любой из двух вариантов подойдет.
Дополнение Для внесения ясности попытался сфотошопить то, чтобы я хотел получить.
Попробовав так, получил краш при использовании FindContours (баг EmguCV или моя ошибка?)
using (Mat hirarchy = new Mat()) { using (VectorOfPoint countours = new VectorOfPoint()) { CvInvoke.FindContours(_diffMat, countours, hirarchy, RetrType.Tree, ChainApproxMethod.ChainApproxSimple);
for (int i = 0; i < countours.Size; i++) { CvInvoke.DrawContours(_diffMat, countours, i, new MCvScalar(0,0,255)); } } }


Ответ

Лучше начать, наверное, сразу со второго пункта, так как могу предположить, что именно он является приоритетным.
Бинаризация (пороговая обработка) - это по сути процесс, при котором количество информации, имеющейся на изображении, сводится к минимуму. Этот факт является одновременно и плюсом и минусом, поскольку вместе с непредставляющей интереса информацией стирается и та, что могла бы существенно помочь в решении задачи.
Если обратиться к изображению с "фотошопом" и в частности к некоторым из многоугольников по центру, границы которых отмечены красными линиями, то не трудно заметить наличие с правой стороны от них белых "зон". Эти "зоны" имеют тот же размер и в целом никак не выделяются от точно таких же белых "зон", но уже входящих в области интереса (парковочные места).
Белые "зоны" внутри области интереса также могут иметь произвольный размер и часто их нельзя рассматривать как единое целое с другими, расположенными неподалёку, поскольку они имеют самостоятельные границы и относительно близкий размер с теми, что не входят в область интереса.
Ко всему прочему, "зоны" между двумя областями интереса могут находиться ближе друг другу (по расстоянию между центральными моментами контуров), нежели чем "зоны" одного и того же парковочного места.
Все вышеперечисленные исключения в полной мере представлены на изображении "фотошопа", что фактически сводит на нет возможность корректной кластеризации контуров "зон" в объекты "автомобиль".
При помощи бинаризации чрезвычайно редко удаётся получить приемлемый результат, если исходное изображение содержит естественную среду.
Однако, если допустить вмешательство человека в работу алгоритма, а именно подсказать последнему настоящие границы объекта путём ручного выделения прямоугольников парковочных мест, то вся задача сведётся к достаточно простой операции. Пример бинаризации изображения на C++ и C# (EmguCV).
Предположим, имеется исходник:

Загружаем его, переводим в оттенки серого и бинаризуем:
C++:
cv::Mat src_mat = cv::imread("img.jpg"); if(src_mat.empty()) return;
cv::Mat gry_mat; cv::cvtColor(src_mat, gry_mat, cv::COLOR_BGR2GRAY);
cv::Mat bin1_mat, bin2_mat; cv::threshold(gry_mat, bin1_mat, 230, 255, cv::THRESH_BINARY); cv::threshold(gry_mat, bin2_mat, 25, 255, cv::THRESH_BINARY_INV); cv::Mat bin_mat = bin1_mat + bin2_mat;
C#:
Mat srcMat = new Mat("img.jpg", LoadImageType.AnyColor); if(srcMat.IsEmpty) return;
Mat grayMat = new Mat(); Mat bin1Mat = new Mat(); Mat bin2Mat = new Mat(); Mat binMat = new Mat();
CvInvoke.CvtColor(srcMat, grayMat, ColorConversion.Bgr2Gray); CvInvoke.Threshold(grayMat, bin1Mat, 230, 255, ThresholdType.Binary); CvInvoke.Threshold(grayMat, bin2Mat, 25, 255, ThresholdType.BinaryInv); CvInvoke.Add(bin1Mat, bin2Mat, binMat);
Здесь выполнена попытка бинаризации по верхней и нижней границам. Коэффициенты подобраны вручную и могут отличаться по оптимальности для других изображений. Таким образом получается сохранить больше полезных деталей:

Далее, если мы начнём искать контуры и нарисуем их:
C++:
std::vector > contours; cv::findContours(bin_mat.clone(), contours , cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::Mat ctr_mat = cv::Mat::zeros(bin_mat.size(), CV_8U); cv::drawContours(ctr_mat, contours, -1, cv::Scalar::all(255), 1);
C#:
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); Mat hierarchy;
CvInvoke.FindContours(binMat, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple);
Mat ctrMat = new Mat(binMat.Size, DepthType.Cv8U, 3); CvInvoke.DrawContours(ctrMat, contours, -1, new MCvScalar(255));
... то получим такую картину:

Контуров оказалось довольно много, и уже закрадывается сомнение в том, что удастся собрать контуры отдельных частей в единый контур автомобиля. Попробуем отфильтровать часть из них, например, по площади, заодно нарисовав их опоясывающие "квадратики" на исходном изображении:
C++:
std::vector > contours; cv::findContours(bin_mat.clone(), contours , cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
std::vector > contours2; for(auto itr = contours.begin(); itr != contours.end(); ++itr) { if(cv::contourArea(*itr) > 8) { contours2.push_back(*itr);
cv::Rect rc = cv::boundingRect(*itr); cv::rectangle(src_mat, rc, cv::Scalar(0,0,255)); } }
cv::Mat ctr_mat = cv::Mat::zeros(bin_mat.size(), CV_8U); cv::drawContours(ctr_mat, contours2, -1, cv::Scalar::all(255), 1);
C#:
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); VectorOfVectorOfPoint contours2 = new VectorOfVectorOfPoint(); Mat hierarchy;
CvInvoke.FindContours(binMat, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple);
for (int i = 0; i < contours.Size; ++i) { if (CvInvoke.ContourArea(contours[i]) > 8) { contours2.Push(contours[i]);
Rectangle rc = CvInvoke.BoundingRectangle(contours[i]); CvInvoke.Rectangle(srcMat, rc, new MCvScalar(0, 0, 255)); } }
Mat ctrMat = new Mat(binMat.Size, DepthType.Cv8U, 3); CvInvoke.DrawContours(ctrMat, contours2, -1, new MCvScalar(255));
Контуров стало значительно меньше, "шума" поубавилось, но мы тем самым продолжаем терять информацию и об объектах интереса (автомобилях), делая их в итоге всё более непохожими на исходные. Те, что расположены поближе к камере, ещё куда ни шло, но чем дальше, тем ситуация становится плачевнее:

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

Но ракурс съёмки не позволяет усомниться: части различных объектов расположены на относительно тех же расстояниях, что части одного и того же объекта, приводя к невозможности корректной кластеризации. А поскольку при бинаризации у нас других факторов, за которые возможно было бы зацепиться, попросту нет, то и задача с автоматическим определением границ автомобилей в имеющихся условиях становится нерешаемой. Ну может быть получится один-два автомобиля, находящихся ближе всего к камере, но не более.
В таком случае не остаётся ничего более, как вручную определить границы парковочных мест. Эту задачу на OpenCV обычно не перекладывают, т.к. у него функционал работы с мышью (с тем, чтобы пользователь указал на изображении координаты точек многоугольников парковочных мест) в целом ограничен и реализуют при помощи фреймворков общего назначения.
Для получения матрицы изображения парковочного места из заранее определённых координат в кадре можно воспользоваться простой конструкцией:
cv::Mat parking_lot_mat = src_mat(cv::Rect(0,0,100,100)).clone();
Теперь parking_lot_mat будет содержать часть исходного изображения по координатам x, равное 0, и y, равное 0, и будет размером 100х100 пикселей.
Далее производим всю ту же работу по бинаризации, что делали над большим изображением. Под конец останется найти контуры и их площади при помощи метода: cv::contourArea(). Если сумма площадей контуров превышает некий порог, вычисленный эмпирически, то значит автомобиль на данном парковочном месте можно считать обнаруженным.

Запуск Java приложений без консоли!

Начал изучать Java, до этого был опыт в Python. В Python я мог написать код сохранить в файл с расширением .py и просто запускать его. В Java же так не получается, нужно только использовать cmd или терминал в Linux для запуска файлов с кодом. Но и запуск просто файла, не достаточно, хочется например, написать какое-то пусть пока даже консольное приложение и передать кому-то ради интереса, но тупо будет просить человека запускать его через консоль. Как можно запаковать файлы например в .exe ?


Ответ

Вообще, если есть такое желание упаковывать java программу в exe, надо задуматься, тот ли язык вы выбрали?
Но если отвечать на ваш вопрос, то можно:
Собрать exe с помощью:
http://www.excelsior-usa.com/resources.html http://launch4j.sourceforge.net/ Запаковать программу в jar (имплементировав логику консольного прерывания, например, через Scanner, чтобы программа после исполнения не закрылась) Запаковать программу в jar и написать .bat файл примерно со следукщим кодом: java -jar youApp.jar pause

Доступ к серверу из интернета

На моем компьютере стоит ubuntu 14 с LAMP сервером, комп выходит в интернет через роутер при подключении WiFi, у меня есть еще и второй комп с виндой, он также выходит в интернет через тот самый роутер, но уже подключен к роутеру через шнурок. Когда я на втором компе обращаюсь к своему серверу, все работает, ftp, ssh и phpmyadmin, в общем, все гут.
Вот теперь хочу, чтобы к моему серверу можно было подключиться из интернета.
Как такое реализовать?


Ответ

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

другие вопросы на ru.so со схожей тематикой:
Как прокинуть IP-адрес через роутер? Доступ к серверу по внешнему IP через роутер Настройка доступа к сайту извне Поднять сервер дома в денвере через роутер D-link dir400 Настройка роутера TrendNet Проброс портов на роутере TP-Link 940N Как настроить доступ к web-серверу в локальной сети? Как присвоить ститичный ip адрес компьютеру в wifi? Как узнать к какому компьютеру подключится клиент? Подключение к веб-серверу из глобальной сети

разрешение аппаратного таймера

С помощью команды в терминале powercfg -energy duration 5 узнал величину разрешение аппаратного таймера: 15,6 мс. В моих программах требуется, чтобы эта величина равнялась 1 мс. Как этого добиться при запуске программы? Для программирования пользуюсь Visual Studio 2013\2015, язык C++
PS Замечания к ответу от avp: вот тут я уже задавал вопрос про таймеры и многие попробовал. Поскольку работал с сетью, то отслеживал еще и через wireshark время пакетов отправленных с помощью таймеров. Результат оказывался плачевным.


Ответ

Возможно, функции timeBeginPeriod и timeEndPeriod (MSDN) это то что вам нужно. С их помощью, вы как раз сможете выставить желаемую точность в 1мс.

jquery drag and drop связи

Что хочу получить:
Картинка для визуализации. Задача состоит в том что бы связывать блоки (динамически протянуть стрелку от одного блок к другому) и в конце получить структуру для дальнейшей работы. Например:
a link to b
b link to c
Так же у одного блок может быть несколько связей. Прошу подсказать направление, как сделать связи.
перетаскивания сделал так:
jQuery UI Draggable - Default functionality

Drag me


Drag me



Ответ

Рабочий вариант, но код не в лучшем виде. Ссылка на plunker.
"use strict"; var can = $("#can").get(0), ctx = can.getContext('2d'); var boxes = []; function get_box(x, y) { for (var box of boxes) { if (x >= box.x && x < box.x + box.w && y >= box.y && y < box.y + box.h) { return box; } } return null; } function getxy(e) { return {x:e.clientX, y:e.clientY}; } class Box { constructor(x, y, w, h) { this.x = x; this.y = y; this.w = w; this.h = h; this.drag = null; this.name = String.fromCharCode("A".charCodeAt() + boxes.length); boxes.push(this); } on_mouse_down(e) { this.drag = { oldx: this.x, oldy: this.y, // old position of box msx: e.clientX, msy: e.clientY // mouse start x, y }; } on_mouse_move(e) { if (!this.drag) return; var dx = e.clientX - this.drag.msx, dy = e.clientY - this.drag.msy; this.x = this.drag.oldx + dx; this.y = this.drag.oldy + dy; draw_boxes(); } on_mouse_up(e) { this.drag = null; } draw() { ctx.save(); ctx.fillRect(this.x, this.y, this.w, this.h); ctx.font = "30px Georgia"; ctx.fillStyle = "white"; ctx.fillText(this.name, this.x + 10, this.y + 30); ctx.restore(); } center() { return {x: this.x + Math.floor(this.w/2), y: this.y + Math.floor(this.h/2) }; } } var link = null, links = []; function on_mouse_event(method_name) { return function (e) { for (var box of boxes) box[method_name](e); } } $("#can").mousedown(function (e) { var p = getxy(e), b = get_box(p.x, p.y); if (e.shiftKey) { new Box(p.x, p.y, 50, 50); draw_all(); return; } if (!b) return; if (e.ctrlKey) { link = {b}; return; } get_box(p.x, p.y).on_mouse_down(e); }); $("#can").mousemove((e) => { if (link) { link.t = getxy(e); } else { for (var box of boxes) box.on_mouse_move(e); } draw_all(); }); $("#can").mouseup((e) => { var x = e.clientX, y = e.clientY, b = get_box(x, y); if (link) { if (link.b == b || !b) { link = null; return; } links.push({from:link.b, to:b}); } else { for (var box of boxes) box.on_mouse_up(e); } link = null; }); $("#getlinks").click((e) => { var msg = ""; for (var l of links) { msg += `Box "${l.from.name}" свзяан с Box "${l.to.name}"
`; } $("#res").html(msg); }); new Box(10, 10, 50, 50); new Box(150, 150, 50, 50); function draw_boxes() { for (var box of boxes) { box.draw(); } } function draw_links() { for (var l of links) { var bc1 = l.from.center(), bc2 = l.to.center(); ctx.beginPath(); ctx.moveTo(bc1.x, bc1.y); ctx.lineTo(bc2.x, bc2.y); ctx.stroke(); } } function draw_link() { var bc = link.b.center(); ctx.beginPath(); ctx.moveTo(bc.x, bc.y); ctx.lineTo(link.t.x, link.t.y); ctx.stroke(); } function draw_all() { ctx.clearRect(0, 0, can.width, can.height); draw_links(); draw_boxes(); if (link) draw_link(); } draw_all(); html, body { margin: 0; padding: 0; }

This text is displayed if your browser does not support HTML5 Canvas.

MouseMove -- перемещение коробок.
Shift + Click -- добавить коробку.
Ctrl (на коробке) + MouseMove -- провести линию.