Страницы

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

среда, 27 февраля 2019 г.

Android in-app billing: как проверить статус покупки?

Я пытаюсь использовать сервис покупок внутри приложений. Проблема состоит в том, что я не знаю как проверить, куплен ли данный предмет на данном аккаунте. Это нужно на тот случай, если пользователь сменит телефон или сделает хард-ресет, и т. п. Мне нужно узнать статус предмета (куплен и ли не куплен) именно из плей маркета, а не с локальной базы данных. Так же я использую robotmedia / AndroidBillingLibrary для упрощения процесса.


Ответ

Воспользуйтесь опцией RESTORE_TRANSACTIONS. Позволяет получить историю операций/покупок клиента - по сути выдергивает записи из Play Market'а

Компиляция скрипта на Java SE7 в Sublime Text 2

Как скомпилировать скрипт на Java SE7 в Sublime Text 2?
Как там настроить компилятор под Java?


Ответ

Я все таки рекомендую использовать eclipse/idea/emacs/vim. Но если сильно-сильно хочется... В принципе ничего не нужно настраивать - все уже есть. После того, как откроете свой жава файл, просто зайдите в меню Tools-> Build System и убедитесь, что там выбрано JavaC. Если нет - выбирайте. Все, теперь можно жать Ctrl+B и саблим запустит javac для компиляции. Установить жаву конечно же нужно. И настроить, что бы она была в путях. На моем ноуте под Fedora все завелось сразу.

Клонирование лицензионной Windows 7 Starter

Имею 10 идентичных машин с предустановленной лицензионной Windows 7 Starter. При первом запуске машины, получаю уже активированный Windows, т.е. лиц. ключ не надо вводить. Образ системы уже активированный лежит на жестком диске машины. Задача, установить и настроить софт на одной машине, затем клонировать образ системы на другие 9 машин. Вопрос, как произвести переактивацию Windows или сменить ключ в системе на склонированных машинах?


Ответ

Вопрос решился. Чтобы удалить ключ из системы надо запустить командную строку(cmd.exe) от имени администратора и в ней пишите: slmgr.vbs /upk Эта команда удалит ключ из системы. Затем можно перезагрузить систему и пройти процедуру ввода ключа и активации. Но можно еще написать: slmgr.vbs /ipk [ваш лицензионный ключ] ` Эта команда добавит ключ в систему, после перезагрузки, нужно будет только активировать систему ` символы "[" и "]" писать необязательно ps: вопрос можно закрывать

Как сделать скриншот главной страницы сайта?

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


Ответ

запустить виртуальную машину с нужной ОС и браузером, выполнить скрипт, который зайдёт на нужный сайт и сделает скриншот — так работают сервисы по оскриншочиванию во всех моделях браузеров, включая вымершие версии; Adobe Air простое приложение, в нём банально компонент браузера, и снятие копии его же экрана в файл.

Использовать ли “use strict”? [дубликат]

На данный вопрос уже ответили: Что значит “use strict”? 2 ответа Доброго времени суток. Есть ли сейчас смысл использовать выражение "use strict" и какие вкусности он дает?


Ответ

"use strict" допустим помогает избежать случайного пропуска new или var, или в таких случаях var func = function(){ this.value = 'value'; var a = function(){ console.log(this.value); } a(); } new func(); "проблем" с this, но почему-то у меня получается избежать этого самостоятельно, возможно потому что изначально поставил за правило использовать new, var, точки с запятой и не использовать eval и with

Структура таблицы в БД (денормализация)

В рамках базы данных (в данном случае - PostgreSQL, но это не суть) есть несколько небольших таблиц, которые содержат практически неизменяемые, но очень часто используемые данные: группы страниц (pagegroups), страницы (pages), шаблоны (templates), позиции на страницах (positions), модули (modules), группы пользователей (usergroups). В каждой из таблиц есть поля ID, название, алиас и порядок показа. Между данными есть связи: группы пользователей имеют разные права доступа, модули могут встречаются на разных позициях разных страниц, каждой странице может быть задан свой шаблон, шаблон состоит из позиций (header, sidebar_left, canvas, sidebar_right, footer), которые могут отображаться или нет и т.п. (список связей должет остаться открытым) Хочу свести все данные в одну таблицу, где представить данные в виде "ключ/значение". Сломал всю голову. Пример базы (PostgreSQL): CREATE TABLE core ( id serial primary key, level int, group int, parent int references core, key text, value text ); Фрагмент данных: INSERT INTO core (id, level, group, parent, key, value) VALUES (1, 0, 1, 0, 'type', 'coreelements'), (2, 0, 1, 0, 'name', 'Компоненты системы'), (3, 1, 2, 1, 'type', 'page'), (4, 1, 2, 1, 'name', 'Страницы'), (5, 1, 2, 1, 'order', ''), (6, 1, 3, 1, 'type', 'template'), (7, 1, 3, 1, 'name', 'Шаблоны'), (8, 1, 3, 1, 'order', ''), (9, 1, 4, 1, 'type', 'position'), (10, 1, 4, 1, 'name', 'Позиции'), (11, 1, 4, 1, 'order', '18,19,20,21,22'), (12, 1, 5, 1, 'type', 'module'), (13, 1, 5, 1, 'name', 'Модули'), (14, 1, 5, 1, 'order', ''), (15, 2, 18, 4, 'name', 'Шапка'), (16, 2, 18, 4, 'alias', 'header'), (17, 2, 19, 4, 'name', 'Рабочая зона'), (18, 2, 19, 4, 'alias', 'canvas'), (19, 2, 20, 4, 'name', 'Левый сайдбар'), (20, 2, 20, 4, 'alias', 'sidebar_left'), (21, 2, 21, 4, 'name', 'Правый сайдбар'), (22, 2, 21, 4, 'alias', 'sidebar_right'), (23, 2, 22, 4, 'name', 'Подвал'), (24, 2, 22, 4, 'alias', 'footer'); Помимо общего вопроса о структуре таблицы смущает меня вот что: В необходимости поля level не уверен, убрать? Поскольку родитель и зависимые записи имеют по несколько пар "ключ/значение", как организовать связь? по ID, по group или третьим способом? Иными словами, что должно быть в поле parent? Как связать, скажем, страницы, модули и шаблоны? Пример к последнему вопросу: Страница 'settings', в header имеет модуль 6, в canvas - модули 1, 3 и 2, в остальных - ничего. Вполне допускаю, что после того, как такая таблица получится, вернусь к первоначальному - нормализованному - варианту. Но поскольку есть возможность попробовать разные варианты - хочу попробовать и этот тоже.


Ответ

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

Работа с кассовым апаратом

Требуется написать программу для работы с кассовыми аппаратами (хотя бы печать чека). Подскажите в какую сторону копать. Есть ли программные эмуляторы кассовых аппаратов для отладки такого рода программ?


Ответ

Для каждого торгового оборудования у разных производителей свои драйвера. Самые распространенные регистраторы - Штрих-М. Идем на сайт, находим свой регистратор, качаем драйвера. Есть еще АТОЛ, тоже популярны довольно. Доступ к драйверу идет через COM, в комплекте с драйверами есть примеры для 1C, delphi и билдера.
По поводу эмуляторов, то скорее всего нет. В любом случае проверять надо на реальном аппарате, т.к. в самом регистраторе существуют настройки - кассиры, отделы, виды оплаты, строки для печати в начале и в конце чека... Обычно тестируют на нефискализованном аппарате (стоимость штрихов, например, от 14к рублей), затем фискализуют его просто.
UPD Пару лет назад сделал класс для Delphi для работы с разными ККМ. uKKMClass.pas. Там же реализация для регистратора Феликс-РК. Печать чека, снятие отчетов и т.д.

Php socket write => java socket write

В пхп эта строка выглядит так: fwrite($socket, "\xFE\x01"); Нужно выполнить это же действие на Java. Не знаю, что передать вместо something методу writeBytes(something). p. s. есть writeChars(string), writeChar(char), если нужно.


Ответ

String charsetName="UTF8"; // или какая там кодировка на выходе вам нужна OutputStream ous=socket.getOutputStream();
byte[] bytes = string.getBytes(charsetName); ous.write(bytes); Если вам много строк передавать, то Writer ouw = new BufferedWriter(new OutputStreamWriter(ous, charsetName)); ouw.write(string, 0, string.length()); но только не совмещайте эти 2 способа записи - если вы передали OutputStream ous в конструктор OutputStreamWriter, то не пользуйтесь ous напрямую.

Оператор & в функциях и const

Немного подзабыл C++ , а может просто раньше и не сталкивался с этим, но на вид всё очень легко. Просто прошу напомнить следующее (можно в кратце, я всё понимаю, но вспомнить не могу, а гугл не воспринимает символ & в поисковой строке): const после метода, насколько я знаю, означает защиту значений *this, а что значит const перед методом? Что значит оператор "&" в шаблонном типе? Это ведь оператор взятия адреса, здесь он причем? Правильно ли я понял, что "=0" в конце означает, что это pure метод? Если так, то зачем ему реализация в данном классе, если этот класс абстрактный, а сам метод будет переопределен в дочерних классах? Или я что-то путаю? Не люблю код, в котором опущены кавычки, вот и запутался... Заранее спасибо! Вот, кстати, и сам код :) template < class UnknownType > class MyClass { public: virtual const UnknownType& method() const throw () = 0; };


Ответ

всё просто UnknownType& это тип: ссылка на UnknownType а const для того чтобы нельзя было изменить то что возвращается да это pure метод, вот только вы не показали что там есть реализация

Возможно ли создание ЧПУ?

Возможно ли создание ЧПУ на пхп(связь с БД) без внесения изменении в htaccess? Есть примеры?


Ответ

Вообще без .htaccess практически не возможно. Исключение - вы сконфигурируете свой сервер соответствующим способом. Хотя не думаю, что это легкий выход из положения. А вот избежать лишней головной боли с mod_rewrite можно. Я уже говорил тут об этом, но не могу найти этот пост, поэтому вкратце повторюсь. Создается правило, с помощью которого все запросы перенаправляются на морду, если директории или файла не существует физически на сервере. Например, так: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L] Теперь, вы ловите такие запросы в php: $request = $_SERVER['REQUEST_URI']; Разбираете полученную строку "на запчасти": по слешу для определения основных частей URI, учитывая окончание, если допустим адрес может быть /some_path/page.html и в зависимости от полученных данных, выводите ту или иную информацию.

Поиск перекрестных совпадений с помощью регулярных выражений

Добрый вечер. Понимаю, что вопрос очень глупый, но голова уже не варит. Да, начинается время зачетов :) Для N-ной лабы по матстату нужно посчитать количество вхождений подстроки в строку. Банальщина. Чтобы эту банальщину хоть как-то приукрасить, пишем extension method для string: public static int P(this string baseStr, string inputStr) { return new Regex(inputStr).Matches(baseStr).Count; } Для справки - в задании строка из N 0 и 1, первым этапом надо посчитать вероятности появления пар в строке. Собственно, мой глупый вопрос: почему описанный метод, вызванный от строки "1111" возвращает 2? Ну не могут же регулярки последовательно считать... UPD: пример вызова метода: string data = "1111"; Console.WriteLine(data.P("11")); //2


Ответ

Всё верно: в строке 1111 всего два вхождения подстроки 11. Регулярные выражения анализируют текст слева направо. При совпадении внутренний "курсор" (индекс) устанавливается на его начальную позицию. Следущее совпадение система начинает искать с позиции, находящейся сразу после текущего совпадения. Таким образом, перекрёстные совпадения невозможны при использовании обычных шаблонов.
Как верно заметил ReinRaus, необходимо воспользоваться механизмом опережающей проверки, т.е. конструкцией (?=...), которая используется для проверки того, что следует после текущей позиции в строке. Несмотря на то, что такие блоки не "поглощают" текст при совпадении (т.е. при нахождении подстроки индекс остаётся на прежнем месте во входной строке), внутри них возможно использование захватывающих подмасок типа (...)
Тут мы подходим к решению проблемы:
string data = "1111"; string sub = "11"; Console.WriteLine(data.P(string.Format("(?=({0}))", Regex.Escape(sub)));
Здесь пример использования данного подхода

Как сделать визуализатор аудио на js?

Надо сделать визуализатор музыки: столбцы, высота которых бы менялась в зависимости от частоты. Как это сделать на js?


Ответ

Да тут вообще много всего понаписано. Попробуйте например dancer.js, даже есть по настоящему красивые результаты
Можете посмотреть здесь куча рекомендаций

Алгоритм нарезки прямоугольника на равные меньшие прямоугольники

Дан исходный прямоугольник N×M. Задача: определить сколько раз можно полностью "уложить" (ориентация любая) меньший прямоугольник n×m в исходный. Возможно, для будущих ходоков будет интересно КАК. Спасибо.


Ответ

Задачка решается просто. Если нужен ответ на вопрос КАК // Возвращает массив расположения блоков [ { x, y, w, h } ] function calc(W, H, w, h) {
var hor = pack([], W, H, w, h, 0, 0); var ver = pack([], W, H, h, w, 0, 0);
// сортировка блоков в порядке сверху-вниз, слева-направо // если не планируется нумеровать блоки - можно удалить return (hor.length >= ver.length ? hor : ver).sort(function(a, b) { return (a.y - b.y) || (a.x - b.x); });
function pack(pieces, W, H, w, h, x0, y0) { var x, y; var nx = W / w | 0; // число блоков, умещающееся по ширине var ny = H / h | 0; // по высоте var n = nx * ny; // всего for (y = 0; y < ny; y++) for (x = 0; x < nx; x++) { pieces.push({ x: x0 + x*w, y: y0 + y*h, w: w, h: h }); } if (W % w >= h && H >= w) { // осталось полезное место справа pack(pieces, W % w, H, h, w, x0 + nx*w, 0); } else if (H % h >= w && W >= h) { // осталось полезное место снизу pack(pieces, W, H % h, h, w, 0, y0 + ny*h); } return pieces; }
} Если нужен ответ на вопрос СКОЛЬКО // Возвращает число блоков function calc(W, H, w, h) {
return Math.max(pack(W, H, w, h), pack(W, H, h, w));
function pack(W, H, w, h) { var n = (W / w | 0) * (H / h | 0); if (W % w >= h && H >= w) { n += pack(W % w, H, h, w); } else if (H % h >= w && W >= h) { n += pack(W, H % h, h, w); } return n; }
} Демо: http://jsfiddle.net/RHq23/

Применить функцию ко всем дивам в блоке

Сразу скажу чтобы в дальнейшем не было вопросов. Вроде "А что так уже не делают?!, разве нельзя просто сделать вот так?! и т.д". В js я полный нуб. И естественно сформировать свой вопрос я не могу(Так сам бы нагуглил)
В чем весь сабж. Есть код
$(document).ready(function() { var margin = $("#image1").width() / 2; var width = $("#image1").width(); var height = $("#image1").height(); $("#image2").stop().css({ width: '0px', height: '' + height + 'px', marginLeft: '' + margin + 'px', opacity: '0.5' }); $("#reflection2").stop().css({ width: '0px', height: '' + height + 'px', marginLeft: '' + margin + 'px' }); $("#image1").mouseover(function() { $(this).stop().animate({ width: '0px', height: '' + height + 'px', marginLeft: '' + margin + 'px', opacity: '0.5' }, { duration: 500 }); window.setTimeout(function() { $("#image2").stop().animate({ width: '' + width + 'px', height: '' + height + 'px', marginLeft: '0px', opacity: '1' }, { duration: 500 }); }, 500); }); $("#image2").mouseout(function() { $(this).stop().animate({ width: '0px', height: '' + height + 'px', marginLeft: '' + margin + 'px', opacity: '0.5' }, { duration: 500 }); window.setTimeout(function() { $("#image1").stop().animate({ width: '' + width + 'px', height: '' + height + 'px', marginLeft: '0px', opacity: '1' }, { duration: 500 }); }, 500); }); });


Сейчас все эффекты применяются только к первому диву vizitka(ко внутренним изображениям). А таких дивов на странице несколько. Как сделать, что бы функция применялась к каждому image1,image2 Которые лежат в vizitka. Я думаю нужно id поменять на класс...НО нужно что-то еще. Все мои попытки оказались тщетными(


Ответ

Пробуйте var doNicely = function (this_) { var $imgs = $('img', this_), $img1 = imgs.eq(0), $img2 = imgs.eq(1);
var margin =$($img1).width()/2; var width=$($img1).width(); var height=$($img1).height();
$($img2) .stop() .css({width:'0px',height:''+height+'px',marginLeft:''+margin+'px',opacity:'0.5'});
$("#reflection2") .stop() .css({width:'0px',height:''+height+'px',marginLeft:''+margin+'px'});
$($img1).mouseover(function(){ $(this) .stop() .animate({width:'0px',height:''+height+'px',marginLeft:''+margin+'px',opacity:'0.5'},{duration:500}); window.setTimeout(function() { $($img2) .stop().animate({width:''+width+'px',height:''+height+'px',marginLeft:'0px',opacity:'1'},{duration:500}); },500); }); $($img2).mouseout(function(){ $(this) .stop() .animate({width:'0px',height:''+height+'px',marginLeft:''+margin+'px',opacity:'0.5'},{duration:500}); window.setTimeout(function() { $($img1) .stop() .animate({width:''+width+'px',height:''+height+'px',marginLeft:'0px',opacity:'1'},{duration:500}); },500); }); }
$(document).ready(function () { $('.vizitka').click(function () { doNicely(this); }); });

Завис Sublime Text 3 при работе с внушительным php файлом при сохранении

Собственно, вопрос, что делать? Кто виноват — понятно. Есть ли возможность спасти скрипт? Может, у Сублайма есть местечко, куда он сохраняет временные файлы? Или другие варианты? ОС — Ubuntu 14.04.


Ответ

Вопрос решился. Сперва полез смотреть где бы subl мог хранить сессии. Обнаружил их в домашней папке пользователя в каталоге /home/user/.config/sublime-text-3/local. В файле *.sublime_session. Открываю и вижу JSON массив. И, о чудо, вижу знакомый код. Правда идет он одной строкой и символы конца строки проставлены как /n. Отлично, скопировав, решил уйти в ребут, т.к. субл намертво завис и закрываться не хотел даже через htop. После ребута открыл subl и случилось самое величайшее во всей этой истории - последний экземпляр кода висел как несохраненная вкладка. Спасибо команде Sublime! Обновление Ах и еще вот что https://github.com/akalongman/sublimetext-autobackups. Замечательный антисединный плагин.

Длина соли и длина выходной стройки алгоритма blowfish

Здравствуйте. В мануале php сказано, что Blowfish-шифрование использует соль след. формата: "$2a$", весовой параметр из двух цифр, "$" и 22 цифры из алфавита "./0-9A-Za-z" . Но на деле вместо 22 у меня почему-то используется только 21 символ. $var = "1111111111111111111112";//22-й символ помечен двойкой
echo strlen($var);//выводит 22
echo crypt("12345", "$2a$11$".$var);// выводит $2a$11$111111111111111111111uDWduZDJM79lPV0duPxKCR2XEmS5ly2q Как видно 22-й символ обрезался и не попал в соль. Вопрос1: Как объяснить выше описанное поведение? Вопрос2: У меня на php длина выходной строки (хэша с солью) всегда равна 60 байт (ну или 60 символов латинского алфавита). Это общий стандарт? стандарт php? Если да, то где описан? Спасибо.


Ответ

Соль задается из алфавита "./0-9A-Za-z" (64 символа), т.е. каждый символ представляет из себя 6 бит. Это напоминает кодировку BASE64. Вы задаете 22 символа это 22*6 = 132 бита. Для Blowfish соль используется 128 бит из-за этого последние 4 бита не используется. Когда выводится результат, то 128 бит также дополняются 4 нулевыми битами, т.е. от последнего символа остается только 2 старших бита. В вашем примере: 2 (111000) -> u(110000), т.е. последний символ Вы можете задавать любой с точность до 2-х старших битов и это не будет влиять на хэш.

Как продолжить выполнение цикла, если словили исключение?

Здравствуйте. Имеется вот такой цикл. String s; while ((s = in.readLine()) != null) { System.out.println(s); } Метод readLine() бросает IOException. Я могу конечно обернуть весь цикл в try-catch, но тогда при возникновении исключения цикл прервётся. Могу в методе, в котором находится этот код дописать throws IOException, но всё равно цикл прервётся. А как сделать, чтобы не прерывался? Неужели только так? String s; while (true) { try { s = in.readLine(); } catch (IOException e) { System.out.println(e); } if(s == null) {break;} System.out.println(s); } Это же как-то не красиво..


Ответ

Да, только так. Если вас смущает конструкция try/catch внутри цикла, можете вынести её в отдельный метод, не бросающий исключений, и глушить исключения там: public void doSth() { // ваш код
String s; while (true) { s = readNextLine(in); if(s == null) {break;} System.out.println(s); }
// ваш код }
private String readNextLine(Reader in) { String s; try { s = in.readLine(); } catch (IOException e) { System.out.println(e); } return s; }

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

Доброго времени суток. Как программно определить, размыто ли фото? Нужно определить, размыто ли фото, и если да, то не дать отправить его на сервер. Возможно, есть какие-то библиотеки или готовые решения? Заранее спасибо.


Ответ

Для этого применяется т.н. алгоритм преобразования Фурье - для обыденного понимания достаточно рассматривать это как разложение сигнала на набор синусоид (сейчас закидают тапочками математики...). Изображение надо рассматривать как двумерный сигнал и, соответственно, разложить его в двумерный ряд Фурье, полученный сигнал проанализировать. В реальных вычислениях применяется дискретное преобразование Фурье - принято обозначать это как FFT - Fast Fourier Transformation. Если в сигнале слишком мало высокочастотных компонент, значит изображение размыто. Что такое слишком много или слишком мало - устанавливайте сами. Для упрощения анализа опять-таки принято полученный сигнал (а по сути новый битмап) проинтегрировать (например, Лапласом) и получить одномерный вектор, который-таки более удобен для анализа. В общем, как-то так. Гуглите по ключевому слову FFT+Java - авось повезет.

Создание Android приложений. Sockets

Здравствуйте. Возникла проблема использования сокета. Вот отдельный от проекта файл Client.java, который служит для проверки соединения в консольном режиме:
import java.net.Socket; import java.net.UnknownHostException; import java.io.*;
public class Client { static AffableThread mSecondThread; public static void main(String[] args) { mSecondThread = new AffableThread(); mSecondThread.start(); } } class AffableThread extends Thread { @Override public void run() { System.out.println("Абракадабра"); try{ Socket socket = new Socket("127.0.0.1", 5555); }catch(UnknownHostException e){}catch(IOException e){} System.out.println("Подключайся любезнейший!"); } }
Работает на ура, подключается к серверу без проблем. Но стоит мне распихать элементы этого кода по моему основному коду, то выдает ошибкy:
> FATAL EXCEPTION: main > java.lang.NullPointerException


Ответ

Без логов ошибки сложно сказать, но вот мои предположения: Нет разрешения в манифесте на интернет Работа с сетью идёт в основном потоке (т.е. в onCreate() активити или фрагмента). Так с определённой версии андроида низзя. Надо делать в отдельном потоке. Например в Service или AsynkTask. Если всё же использовать Service, то надо про него почитать доки И делать как-то так: Создаём класс, расширяющий класс android.app.Service public class MyService extends Service { @Override public void onCreate() {
}
@Override public int onStartCommand(Intent intent, int flags, int startId) { //вот тут можно работать с сетью без проблем. return super.onStartCommand(intent, flags, startId); }
@Override public void onDestroy() { }
@Override public IBinder onBind(Intent intent) { return null; } } Теперь его надо прописать в манифесте: И наконец, теперь можно вызвать всё это из активити: Intent intent = new Intent(this, MyService.class); this.startService(intent);

Mp3 аудио продолжает играть при переходе по страницам

Есть скрипт, который проигрывает музыку на одной странице: Но при переходе на другую страницу сайта музыка обрывается и начинает играть с самого начала вместо того, чтобы продолжить играть дальше. Три часа поисков в гугле ничего не дали, кроме замечаний в разных блогах, что "музыка на сайте - это плохо". Вдобавок ко всему, когда закрываешь сайт на планшете, музыка продолжает играть! И исчезает только при перезагрузке! Как это понимать? Подскажите, пожалуйста, плагин для бесконечного проигрывания фоновой музыке, которая продолжается при переходе по страницам. Заранее спасибо!


Ответ

Судя по всему, у вас каждая страница подгружается самостоятельно. Т.е. при переходе между страницами каждый раз происходит загрузка страницы. Отсюда и сбрасывание текущего воспроизведения - плеер ведь не знает о том, что вы перешли между страницами. Для него каждая страница - это новое открытие страницы. Отсюда вывод: надо либо сказать плееру, что мы проигрывали через куки (не знаю, есть ли плеер, который это может), либо делать автоподгрузку страниц (т.е. использовать шаблоны). При использовании шаблонов у вас будет одна страница, контент которой меняется через AJAX-запросы. В таком случае ваш плеер можно будет расположить вне динамического контента, тогда он будет играть постоянно, даже при переходах между страницами. Но плагин, который привел я, вроде как имеет один недостаток: все страницы доступны только по одному адресу. Поэтому нельзя будет дать ссылки на разные страницы (например, на контакты, меню и т.д.) - все ссылки будут вести только на главную страницу. Но и это не проблема: некоторые плагины для jquery (и не только для него) поддерживают изменение строки браузера, при этом сам механизм работы остается прежним. Таким образом у каждой страницы будет свой собственный адрес (через хэштеги), но фактически работать вы будете по-прежнему с одной страницей. Т.е. ваш плеер будет продолжать играть без перерыва. Так, например, сделано у VK и OK. Насчет плеера, который через куки ловит, что надо проигрывать: не уверен, что такие вообще есть, т.к. в данном случае каждый раз при переходе между страницами придется загружать один и тот же аудиофайл (что не быстро). Даже если файл будет быстро загружен, то при переходе между страницами все равно будет заикание, т.к. в момент перехода текущий dom будет уничтожен, а новый с плеером еще не загрузился. А про фоновое воспроизведение на планшете: сам давно уже не работаю с html/js, поэтому точно не помню. Вроде как страница не закрывается, а просто сворачивается, поэтому воспроизведение и продолжается. Все, что надо, - ловить момент сворачивания и ручками останавливать воспроизведение, при разворачивании - продолжать воспроизведение. Хотя еще раз - уже давно не работал с этим, может быть, там какие-то другие особенности.

Как питоном загрузить ресурс из jar файла?

Всем привет. Я в python/jython новичок. Возникла проблема: надо загрузить файлы из определенного каталога. Локально, никаких проблем for name in glob.glob("%s/*.json" % some_path): log.debug(name) definition = json.loads(file(name).read()) Проблемма вот в чем: основная аппликация на java распространяется как jar(s), и все ресурсы тоже сидят в jar'e. Путь к папке ресурсов определяется в jave: URL resourceURL = CommonMethods.class.getClassLoader().getResource(resourceName); String resourcePath = resourceURL.getPath(); String dirPath = resourcePath.substring(0, resourcePath.lastIndexOf("/")+1); Если ресурс в jar'e, то получаем dirPath="file:/opt/lib/core-lib-1.0.jar!/rulz/" И glob.glob() не работает, думаю, что file(name).read() тоже. :( Подскажите, как читать файлы питоном из jar'a?


Ответ

А вот так не подойдет?
def show_jar_classes(jar_file): """prints out .class files from jar_file""" zf = zipfile.ZipFile(jar_file, 'r') try: lst = zf.infolist() for zi in lst: fn = zi.filename if fn.endswith('.class'): print(fn) finally: zf.close()
То есть действуем так как-будто jar эквивалентен zip (взял здесь).

Открытие ассоциированных с программой файлов в уже запущенном экземпляре программы (вместо запуска нового)

Для того, чтобы открыть ассоциированный файл, программа проверяет при запуске были ли переданы в нее какие-либо параметры. Для простоты можно представить, что открывается текстовый файл.
private static void Main(string[] args) { if(args != null && args.Length > 0) { string fileName = args[0]; // дальше что-то делаю с файлом } }
Проблема в следующем. Если я открываю с помощью проводника очередной файл, то открывается новая копия программы, а мне надо, чтобы файл открывался в уже открытой копии, если она есть или открывал, если нет.


Ответ

Есть следующий способ запуска только одной сущности любого .NET приложения:
При запуске создаем и пытаемся залочить мьютекс. Если это удалось -- это первый инстанс приложения. Если взять лок не удалось -- значит, наше приложение уже запущено (поскольку мьютекс является объектом ОС и шарится между всеми процессами). Если мы обнаружили, что приложение уже запущено, нам нужно передать сообщение (в вашем случае -- путь к файлу) запущенному процессу. Это можно сделать любым из способов межпроцессорного взаимодействия: сообщения Windows, веб-сервис и т.д. При любом выходе из приложения (нормальном или аварийном) не забываем освобождать мьютекс. Пример правильного использования мьютекса -- тут
В случае Windows Forms приложения есть более простой способ, описанный на StackOverflow

Слияние в GIT и командная работа

Помогите, пожалуйста, разобраться с командной работой в Git. Пока работа настроена так: 2 программиста: 1 делает работу, другой проверяет.
Тот который делает получает таски, для выполнения каждого таска создает новую ветку после после того как выполнил задание пушит эту ветку на сервер, сливает ветку со своим мастером делает новую ветку для таска и т.д.
Проверяющий забирает ветки с сервера и делает проверку если все ок вливает их в мастер отправляет на сервер. Если сделаны ошибки возобновляет таск.
Это все как-то коряво, я думаю можно сделать лучше, подскажите как, наведите на правильный путь!
Сейчас проблемы возникают на этапе проверки при слиянии веток. Как можно слить только те комиты которые были сделаны в сливаемой ветке ?


Ответ

Как можно слить только те комиты которые были сделаны в сливаемой ветке ?
В git под термином «ветка» (branch) подразумевается указатель на коммит, а не набор коммитов, как в некоторых других системах управления версиями файлов.
Иными словами, это точка, а не отрезок
Вам требуется перенести несколько коммитов (отрезок), а для этого нужно указать две точки
К примеру: одобренная задача решалась в ветке task125, а предыдущая, пока не одобренная задача, решалась в ветке task124.
Тогда для включения (в текущую ветку) одобренных коммитов (отрезка между этими двумя точками) можно использовать такую, например, команду:
git cherry-pick task124..task125

Свой атрибут/описание для public поля класса

Есть у меня классы, у них открытые переменные. Я через reflection добираюсь до их значений для последующего отображения/изменения.
По умолчанию - есть некоторый диапазон для изменения, условно -+20%.
Но для некоторых переменных есть свои особенности: -10%/+20% или 0..100. Это исключения, они не многочисленны, но они есть.
Мне хочется, когда буду перебирать переменные, чтобы можно было прямо в коде задать для переменной свой атрибут или не знаю как это называется - описание, которое я мог бы пропарсить:
public int Length;
// Min: 0. Max: 100 public int Size;
[Range:20%] public int Weight;
Чтобы было более наглядно: у Unity3D есть HideInInspector. Что-то похожее хочу сделать, но более информативно.


Ответ

Используйте для этого кастомные классы атрибутов, они для того и созданы, чтобы предоставлять мета-информацию об объектах в отражениях.
Например, вот атрибут, позволяющий задавать диапазон для полей:
[AttributeUsage(AttributeTargets.Field)] class RangeAttribute : Attribute { public int Percent { get; set; }
public RangeAttribute (int percent) { Percent = percent; } }
Задавать значение диапазона на поле можно так:
class Foo { [Range(20)] public int Bar; }
Ну а дальше — отражения:
FieldInfo barField = typeof(Foo).GetField("Bar"); RangeAttribute barRange = barField.GetCustomAttribute(); int range = barRange != null ? barRange.Percent : 20; var foo = new Foo(); barField.SetValue(foo, 10);
См.:
Attributes Tutorial (MSDN) Writing Custom Attributes (MSDN) Creating Custom Attributes (MSDN)

Статистика по вопросам, сгруппированная по меткам (Data.SE)

Дано:
Posts — сообщения двух типов: вопросы и ответы, связаны через ParentId, тип указан в PostTypeId (1 — вопрос, 2 — ответ). Вопрос закрыт, если ClosedDate is not null Вопрос отвечен, если AcceptedAnswerId is not null или есть ответ со Score > 0 Вопросы содержат счётчики AnswerCount, ViewCount, CommentCount — количество ответов, просмотров, комментариев. Tags — текстовые метки, связанные многие-ко-многим с вопросами через PostTags
Требуется:
Собрать статистику по вопросам, сгруппированную по меткам: сколько всего вопросов, сколько закрыто, сколько имеет хоть какой-то ответ, сколько отвечено. А также собрать статистику: сколько в среднем ответов, просмотров, комментариев. Статистика должна быть за некоторый временной период (например, за последние 8 недель, кроме последних 3 дней).
Решение:
declare @IncludeRecentWeeks int = 8 declare @ExcludeRecentDays int = 3
declare @LastDate datetime = (select max(CreationDate) from Posts) declare @StartDate datetime = dateadd(week, -@IncludeRecentWeeks, @LastDate) declare @EndDate datetime = dateadd(day, -@ExcludeRecentDays, @LastDate)
;with
Questions as ( select q.*, pt.TagId from Posts as q inner join PostTags as pt on pt.PostId = q.Id where q.PostTypeId = 1 -- question and q.CreationDate > @StartDate and q.CreationDate < @EndDate ),
TagStats as ( select t.TagName as [Tag], ( select count(q.Id) from Questions as q where q.TagId = t.Id ) as [QuestionCount], ( select count(q.Id) from Questions as q where q.TagId = t.Id and q.ClosedDate is not null ) as [ClosedQuestionCount], ( select count(q.Id) from Questions as q where q.TagId = t.Id and q.AnswerCount > 0 ) as [AnsweredQuestionCount], ( select count(*) from ( select q.Id from Questions as q inner join Posts as a on a.ParentId = q.Id where q.TagId = t.Id and (a.Score > 0 or q.AcceptedAnswerId = a.Id) group by q.Id ) as _ ) as [UpvotedAnsweredQuestionCount], ( select sum(AnswerCount) from Questions as q where q.TagId = t.Id ) as [TotalAnswerCount], ( select sum(ViewCount) from Questions as q where q.TagId = t.Id ) as [TotalViewCount], ( select sum(CommentCount) from Questions as q where q.TagId = t.Id ) as [TotalCommentCount] from Tags as t )
select top 50 Tag, QuestionCount as [Qs], format(1.0 * ClosedQuestionCount / QuestionCount, 'p') as [Qs Closed %], format(1.0 * AnsweredQuestionCount / (QuestionCount - ClosedQuestionCount), 'p') as [Qs with As %], format(1.0 * UpvotedAnsweredQuestionCount / (QuestionCount - ClosedQuestionCount), 'p') as [Qs with + As %], format(1.0 * TotalAnswerCount / QuestionCount, 'f') as [Avg As], format(1.0 * TotalViewCount / QuestionCount, 'f') as [Avg views], format(1.0 * TotalCommentCount / QuestionCount, 'f') as [Avg Cs] from TagStats order by QuestionCount desc
Запрос на Data.StackExchange.com, где можно посмотреть результаты выполнения.
Вопрос:
В получившемся вопросе присутствует большое количество подзапросов, что вряд ли положительно сказывается на производительности. Можно ли оптимизировать запрос и избавиться от такого большого числа подзапросов?
Предупреждение:
Этот запрос — продукт технологий программирования SODD (Stack Overflow Driven Development) и CPDD (Copy-Paste Driven Development). SQL я не умею, поэтому любые замечания по качеству кода приветствуются.


Ответ

На самом деле разница если и получится, то не очень большая. Проблему составляет выборка "вопросы помноженные на метки", которые нужны все для сортировки и они занимают около 100% времени выполнения. Остальные операции занимают сущие копейки. Тем не менее, данные можно получить одним запросом (ну почти), код просто будет короче и местами быстрее:
declare @IncludeRecentWeeks int = 8 declare @ExcludeRecentDays int = 3
declare @LastDate datetime = (select max(CreationDate) from Posts) declare @StartDate datetime = dateadd(week, -@IncludeRecentWeeks, @LastDate) declare @EndDate datetime = dateadd(day, -@ExcludeRecentDays, @LastDate)
select top 50 tagname Tag, cnt Qs, format(1.0*closed/cnt,'p') [Qs Closed %], format(1.0*answered/(cnt-closed),'p') [Qs with As %], format(1.0*accepted/(cnt-closed),'p') [Qs with + As %], format(avganswers, 'f') [Avg As], format(avgviews, 'f') [Avg views], format(avgcomments,'f') [Avg Cs] from ( select t.tagname, count(pt.postid) cnt, sum(iif(q.ClosedDate is not null,1,0)) closed, sum(iif(q.AnswerCount>0,1,0)) answered, sum(iif(q.AcceptedAnswerId is not null or a.upvotedanswers>0,1,0)) accepted, sum(q.AnswerCount) answers, avg(q.AnswerCount+0.0) avganswers, sum(q.ViewCount) views, avg(q.ViewCount+0.0) avgviews, sum(q.CommentCount) comments, avg(q.CommentCount+0.0) avgcomments from postTags pt join Tags t on pt.tagid = t.id join Posts q on pt.postId = q.id join (select qq.id postId, sum(isnull(aa.id,0)) upvotedanswers from Posts qq left join Posts aa on qq.id = aa.parentid and aa.score>0 where qq.CreationDate between @StartDate and @EndDate group by qq.id ) a on q.id = a.postid where q.CreationDate between @StartDate and @EndDate group by t.tagname ) aggtags order by aggtags.cnt desc
http://data.stackexchange.com/ru/query/313286/tags-stats-mod
ЗЫ Добавил также фильтр по дате для вопросов с заплюсованными ответами, но (лень план запроса разбирать подробно) индекса либо нет, либо он не используется - разницы не заметил.

Заработает ли Intel C++ Compiler на AMD процессоре?

Кто нибудь устанавливал его не на процессоры семейства Intel?


Ответ

AMD и Intel базируются на одной архитектуре x86 или amd64. Хотя в новейших процессорах у них и могут быть разночтения в наборе команд, большая часть оных одинакова. Разумеется никто в здравом уме не станет использовать такие инструкции, которые не позволят запускать компилятор на процессоре конкурента. Это потеря рынка равноценна экономическому самоубийству, учитывая тот факт, что компилятор от Intel, мягко говоря, не на ведущих ролях. Таким образом ответ на вопрос - да, заработает и по другому быть не может.
Генерирует ли компилятор от Intel такой код, что он будет быстрее на Intel? Лучше этот вопрос адресовать разработчикам от Intel, но вероятность этого есть, хотя и небольшая.

navigation drawer: тормоза при выбор элемента списка

Всем привет. В качестве меню в приложении использую navigation drawer. Всё делала согласно туториалам. При свайпе всё отлично, всё красиво, меню выдвигается и прячется на место очень гармонично. Но если я выбираю элемент из списка, то меню прячется скачками. Кто-нибудь сталкивался? В чём может быть проблема?
Что у меня есть: ParrentActivity extends ActionBarActivit,
Стандартный макет для него



При выбор элемента списка открывается один из фрагментов.
Fragment fragment = null; Bundle args = new Bundle(); switch (position){ case 1: fragment = NewsFeedFragment.newInstance(); args.putString("arg","arg"); break; case 2: fragment = ArticlesFragment.newInstance(); args.putString("arg","arg"); break; case 3: fragment = BlogsFragment.newInstance(); args.putString("arg","arg"); break; case 4: fragment = Research2Fragment.newInstance(); args.putString("arg","arg"); break; case 5: fragment = AuthorsFragment.newInstance(); args.putString("arg","arg"); break; default:break; } fragment.setArguments(args); FragmentManager frgManager = getSupportFragmentManager(); frgManager.beginTransaction().replace(R.id.content_frame, fragment) .commit();


Ответ

В отдельном потоке фрагменты заменяю. Теперь всё окей.
private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView parent, View view, final int position, long id) { mDrawerLayout.closeDrawer(mDrawerList); new Handler().postDelayed(new Runnable() { @Override public void run() { selectItem(position);
} }, 300); } }

Qr коды(создание/чтение) android

Хочу научится работать с QR кодами. Решил сделать так: создать QR, и считать QR. Для создания QR-кода, я решил использовать библиотеку zxing. Скачал zxing-1.3.jar и подключил. Все вроде работает, но когда я создаю qr с русскими символами, то мне выдает непонятную штуку, я решил ее так:
final QRCodeWriter writer = new QRCodeWriter();
//картинка где выводить ImageView tnsd_iv_qr = (ImageView)findViewById(R.id.qrImage);
//кодировка Charset charset = Charset.forName("UTF-8"); CharsetEncoder encoder = charset.newEncoder();
byte[] b = null;
try { // кодирую строку ByteBuffer bbuf = encoder.encode( CharBuffer.wrap( phone + "/" + name + "/" + id ) );
b = bbuf.array(); } catch (CharacterCodingException e) { Log.e(e.toString(), e.toString()); }
String data;
try { data = new String(b, "ISO-8859-1"); Hashtable hints = new Hashtable(2); hints.put(EncodeHintType.CHARACTER_SET, "ISO-8859-1");
ByteMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, 512, 512, hints);
int width = 512; int height = 512;
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { if (bitMatrix.get(x, y)==0) { bmp.setPixel(x, y, Color.BLACK); } else { bmp.setPixel(x, y, Color.WHITE); } } } //создаю qr tnsd_iv_qr.setImageBitmap(bmp); } catch (WriterException | UnsupportedEncodingException e) { e.printStackTrace(); }
Проблема решилась(я так думал), русские символы зашивает, пока я не протестировал код на других устройствах, получается та же проблема с кодировкой русских символов.
Читаю я QR библиотекой ZBarScanner вот так:
//при нажатой кнопке Intent intent = new Intent(getApplicationContext(), ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[]{Symbol.QRCODE}); startActivityForResult(intent, ZBAR_SCANNER_REQUEST);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { String contents = data.getStringExtra(ZBarConstants.SCAN_RESULT); int format = data.getIntExtra(ZBarConstants.SCAN_RESULT_TYPE, 0);
Log.e("add sale", contents);
if(format == 64) { setInformClient(contents); } } else if(resultCode == RESULT_CANCELED) { Toast.makeText(this, "Camera unavailable", Toast.LENGTH_SHORT).show(); } }
Хочу спросить, какие библиотеки используете вы для создание qr с использованием русских символов? И подскажите почему у меня проблема с кодировками?
UPD
При чтении некоторых qr где есть русские символы некоторые слова выводило нормально, а некоторые типа такого плана: ミ籍スムひセミス ミ漬セミサム糊エム糊コミセ (в гугл трансейт даже можно перевести =) ). Начал использовать для чтения QR библиотеку zxing, все хорошо, только не нравится что когда я запускаю на телефоне, на телефоне вместо одного приложения ставятся 2, одно мое приложение, а второе с аналогичным названием и иконкой, только когда я его запускаю то сразу включается сканер


Ответ

Судя по коду, вы:
Создаете строку в UTF-8 Преобразуете её в массив байт Читаете получившийся масив байт обратно в строку, указывая что у вас в массиве лежит строка в кодировке ISO-8859-1. И уже эту новую строку вы пишете в QR-код.
Собственно в этом и есть вся проблема. Уберите это мягко говоря странное преобразование, и тупо записывайте строку в UTF-8. Если строка содержит не латинские символы, то для записи в QR лучше использовать именно её:
private BufferedImage getQRImage(String phone, String name, int id) throws WriterException { QRCodeWriter writer = new QRCodeWriter();
Hashtable hints = new Hashtable(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
String contents = phone + "/" + name + "/" + id; BitMatrix matrix = writer.encode(contents, BarcodeFormat.QR_CODE, 512, 512, hints);
return MatrixToImageWriter.toBufferedImage(matrix); }
Выдает картинку, которая читается всеми имеющимися у меня устройствами.

Зафиксировать отображение в WebView

Есть простой WebView mWeb:

в который я передаю стороку html:
mWeb.loadData(myhtml, "text/html; charset=utf-8", "UTF-8");
Все работает нормально, но когда при прокрутке нечайно сделаешь свайп влево или прово, текст начинает съезжать. Так вроде и ничего, но тут тоже проблема, текст стает не на прежнее место после свайпа. Как можно зафиксировать отображение содержимого в WebView чтобы не свайпилось по бокам?


Ответ

Вам нужно указать действие на свайп:
findViewById(R.id.html).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE) return false; } });

Где в реестре Windows указывается браузер по умолчанию?

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


Ответ

Дефолтный бразузер может быть разным для разных протоколов.
Ассоциации протоколов работают так же, как ассоциации файлов:
HKEY_CLASSES_ROOT\http\shell\open\command
где HKEY_CLASSES_ROOT - это результат мержа HKEY_CURRENT_USER\Software\Classes и HKEY_LOCAL_MACHINE\Software\Classes
UP: начиная с висты, ассоциации протоколов пишутся еще и в
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http
так что стоит проверять оба варианта.
Длинная статья с подробностями: How Does Your Browser Know that It’s Not The Default.

Чем смотреть исполняемый код .net приложения?

Хочу полазить по скомпилированному приложению, чтобы увидеть оптимизации, производимые jit-компилятором.
Какие программы использовать, чтобы получить листинг нативного кода после прохода jit и их меппинг на инструкции il-кода? В идеале бы ещё меппинг на C#-код.


Ответ

Запустите или присоединитесь к своему приложению отладчиком Visual Studio, установите брекпойнт в интересующем месте, и когда он сработает - выберите пункт меню "Debug/Windows/Disassembly".
Опции для показа IL там нет. Можно только установить галочку "Show source code", и тогда будет показан маппинг машинного и исходного кода(на C#, VB.NET, или на другом языке, на котором вы программируете).

Как в Golang прервать выполнение кода?

Как в Golang прервать выполнение кода? Аналог exit()/die() в PHP.
Есть
func Index(w http.ResponseWriter, r *http.Request) { parametr=0 if parametr!="1" { fmt.Fprintln(w, "Параметр=1") } fmt.Fprintln(w, "текст после проверки") //Я хочу это не отображать,если parametr!="1" }
Нужно, если параметр не 1, то выйти из функции (но не из приложения вообще). Можно, конечно, поставить else, но везде тогда делать обёртки? Или можно как-то выйти из функции?


Ответ

выход
func os.Exit(code int)
Exit causes the current program to exit with the given status code. Conventionally, code zero indicates success, non-zero an error. The program terminates immediately; deferred functions are not run.
мой вольный перевод:
Exit вызывает завершение текущей программы с указанным кодом завершения. принято считать, что код 0 означает успешное завершение, а не-нулевой код означает ошибку. программа завершается немедленно, отложенные функции не вызываются.
возврат
return [ ExpressionList ]
A "return" statement in a function F terminates the execution of F, and optionally provides one or more result values. Any functions deferred by F are executed before F returns to its caller.
мой вольный перевод:
оператор "return" в функции "F" прерывает выполнение "F" и (опционально) возвращает один или более результатов. любые функции, «отложенные» функцией "F", выполняются перед тем, как управление вернётся в вызывавшую "F" функцию.
примеры:
func noResult() { return }
func simpleF() int { return 2 }
func complexF1() (re float64, im float64) { return -7.0, -4.0 }

PHP. Регулярное выражение, допускающее отсутствие некоторых частей

Есть текст, типа: "Осталось 10 часов 15 минут 12 секунд". Некоторые компоненты (часы, минуты, секунды) могут отсутствовать. Нужно выдернуть циферки и соотнести с часами, минутами, секундами. Делаю так:
Осталось\s+(?!(\d+)\s+(час).*?)(?!(\d+)\s+(минут).*?)(?!(\d+)\s+(секунд).*?)
Текст подходит под регулярное выражение, но от него всегда остается только "Осталось " при любых комбинациях час., мин., сек.
P.S. Нашел информацию по (?!...). Они, оказывается, используются только для проверки, но ничего не выводят.
Каким образом можно одновременно проверить наличие фрагментов и выдернуть данные?


Ответ

Нужно использовать комбинацию из проверяемой части и захватывающей части. Примерно вот так:
Осталось\s+((?\d+)\s+час(а|ов)?\s*)?((?\d+)\s+минут(а|ы)?\s*)?((?\d+)\s+секунд(а|ы)?)?
После обработки в именованных группах будут требуемые значения.
Демо тут (спасибо за наводку @stribizhev)

Передача в метод обобщенных интерфейсов

Имеется такой код:
public interface IInterface { IDictionary GetData(); }
public class Base { }
public class A: Base { }
public class B : Base { }
public class ADA: IInterface { public IDictionary GetData() { return new Dictionary(){ {0, new A() }}; } }
public class BDA : IInterface { public IDictionary GetData() { return new Dictionary() { { 0, new B() } }; } }
public class MyClass { public static void Fill(params IInterface[] @interface) { foreach (var access in @interface) access.GetData(); } }
Он не компилируется, вопрос такой: Как можно передать несколько реализаций интерфейса IInterface в метод Fill ? Есть разные способы, хочется узнать какой правильный. Если ошибка в проектировании, подскажите пожалуйста как будет верно ? Классы Base, A, B изменять нежелательно.


Ответ

Т.к. строгой типизации все равно не получить, то есть несколько вариантов:
dynamic:
public static void Fill(params dynamic[] interfaces) { foreach (var access in interfaces) { object data = access.GetData(); } } dynamic с маркер-интерфейсом:
public interface IInterface { }
public interface IInterface : IInterface { IDictionary GetData(); }
public static void Fill(params IInterface[] interfaces) { foreach (dynamic access in interfaces) { object data = access.GetData(); } } Реальный интерфейс с неявной реализацией в ADA и BDA
public interface IInterface { IDictionary GetData(); }
public interface IInterface : IInterface { new IDictionary GetData(); }
public class BDA : IInterface { public IDictionary GetData() { return new Dictionary() { { 0, new B() } }; }
IDictionary IInterface.GetData() { return (IDictionary)this.GetData(); } }
public static void Fill(params IInterface[] interfaces) { foreach (var access in interfaces) { IDictionary data = access.GetData(); } }
В последнем случае типизация какая-никакая будет. В первых двух - object.

Как динамически создать массив, не зная количества его элементов? [дубликат]

На данный вопрос уже ответили: Как создать динамический массив? 3 ответа В цикле читаю некоторый блок данных по частям различных размеров. Требуется учитывать размеры этих частей - думаю загонять их в массив. Как создать этот массив, если я не знаю сколько частей будет? Возможно ли реализовать такое в языке С стандартными методами?


Ответ

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

Возможно ли в datagrid вывести подстроки?

У меня есть коллекция объектов, каждый объект имеет в себе коллекцию других объектов. Возможно ли эту коллекцию вывести в DataGrid. Мой код: //ViewModel
public class ObladnanViewModel { public ObservableCollection Collection { get; set; } public ObservableCollection Electromotors { get; set; }
public ObladnanViewModel() { Electromotors =new ObservableCollection() { new ElectromotoruModel(){Id= 1,Marka = "AO2",Name = "Main"}, new ElectromotoruModel(){Id=2,Marka = "4",Name = "Main"}, new ElectromotoruModel(){Id=3,Marka = "AO2",Name = "Main"} }; Collection=new ObservableCollection() { new ObladnanModel(1,"Obl1",Electromotors), new ObladnanModel(2,"Obl2",Electromotors) }; } }
Класс ElectromotoruModel:
public class ElectromotoruModel { public int Id { get; set; } public string Name { get; set; } public string Marka { get; set; } }
public class ObladnanModel { public int Id { get; set; } public string Name { get; set; } public ObservableCollection Elektromotors { get; set; }
public ObladnanModel(int id, string name, ObservableCollection electromotors) { this.Id = id; this.Name = name; this.Elektromotors = electromotors; } }
И пробивал так XAML:

Но в Motors выводит просто пустую строку. Возможно ли сделать так:


Ответ

Нашел решение. Правда не в DataGrid а в ListBox но и так пойдет) Моя ViewModel:
public class ObladnanViewModel {
public ObservableCollection Collection { get; set; }
public ObladnanViewModel() { Collection=new ObservableCollection() { new ObladnanModel(1,"Obl1",new ObservableCollection() { new ElectromotoruModel(){Id= 1,Marka = "AO2",Name = "Main"}, new ElectromotoruModel(){Id=2,Marka = "4",Name = "Main"}, new ElectromotoruModel(){Id=3,Marka = "AO2",Name = "Main"}}),
new ObladnanModel(2,"Obl2",new ObservableCollection() { new ElectromotoruModel(){Id= 1,Marka = "36",Name = "Main"}, new ElectromotoruModel(){Id=6,Marka = "4",Name = "Vent"}, new ElectromotoruModel(){Id=3,Marka = "AO6",Name = "cooling"}, new ElectromotoruModel(){Id = 4,Marka = "C03",Name = "movement table"}} ) }; } }
Код Xaml:






Результат:

Dispatcher не запускает метод в нужном потоке

У меня есть WPF окно, по событию которого вызывается комманда ViewModel. Она в свою очередь вызывает метод из BAL, запускающий дочерний поток(может жить от 10 сек до бесконечности). Данный поток генерирует события по мере выполнения и еще одно событие в самом конце, извещающее о конце работы. Тк события происходят не основном потоке, то ViewModel использует Dispatcher для синхронизации. Если я что-то на проектировал не так, буду рад узнать. Для выполнения кода в нужном потоке я использую следующий код
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(SomeMethod));
Но этот код не вызывает мне нужный метод в обще. Далее я попробовал вызвать следующий код
Dispatcher.CurrentDispatcher.Invoke(new Action(SomeMethod));
В итоге я все равно получил ошибку, тк выполнение не в главном потоке. Тестирования ради я объявил поле _dispatcher и инициализировал его в конструкторе в время работы главного потока. Данный диспетчер мне уже все спокойно вызывал. С чем это связано и как мне быть? Если я вдруг создам ViewModel не в главном потоке, то у меня опять работать ничего не будет.


Ответ

Смотрите.
Dispatcher.CurrentDispatcher возвращает вам диспетчер для данного потока. Поэтому у вас нету альтернативы хранению ссылки на диспетчер.
Затем, VM-объекты обязаны бежать в UI-потоке (иначе вы не сможете биндить к ним View), так что они должны конструироваться тоже в UI-потоке. А значит, вы вполне можете рассчитывать на то, что уж в конструкторе у вас будет правильный Dispatcher.CurrentDispatcher

Почему не работает диспетчер, созданный в фоновом потоке? Диспетчер — это абстракция над циклом сообщений. Если в данном потоке бежит цикл сообщений, то Dispatcher.CurrentDispatcher его вам и возвращает. Если же для данного потока диспетчера нету, создаётся новый и прикрепляется к данному потоку. Но этот диспетчер ещё не запущен! Команда лежит в очереди и дожидается. Если вы запустите диспетчер в фоновом потоке, то все команды, отосланные ему, будут выполнены.
Однако, не пытайтесь сделать это в потоке из пула потоков: для работы диспетчера поток должен быть STA, а потоки из пула — не STA (и это нельзя поменять).
Ну и по-хорошему обычно вам должно хватать диспетчера в UI-потоке.

node.js: зачем использовать express?

Прочитал массу статей, но так и не понял какой смысл привязываться к express и шаблонизаторам? Не дает ли больше контроля над собственным приложением подход с использованием базовых модулей node.js как описано в этой книжке
Прежде всего интересует с точки зрения безопасности (в том числе "затруднение" ддос атаки), а не удобства и времени разработки.


Ответ

Шаблонизаторы удобны тем, что разметка не пишется в коде. ПОмимо отделения логики от разметки, отпаданет необходимость экранирования всяких символов и кучи конкатенаций строк.
Что касается контроля. Node.js даёт вообще максимальный контроль за происходящем. Но, чем более низкоуровневые инструменты ты используешь, тем больше придётся реализовать самому. Да, это даст максимальную гибкость в тех местах, которые нужны лично тебе. Но одновременно это значительно увеличит время разработки.
Далее, в плане безопасности. Вот стал ты делать что-то сам. Да, возможно, ты суперкрутой специалист в этой теме, сделаешь всё идеально и оно будет очень хорошо работать. Да, возможно. Но таких случаев единицы. Весьма вероятно, что ты что-то не учтёшь, сделаешь посредственно и, даже если удастся избежать явных косяков, можно просто насажать всяких дыр.
Плюс популярных модулей в том, что они широко используются и можно рассчитывать, что раз их выбрали, то они достаточно качественные, чтобы этого заслужить. Кроме того, можно рассчитывать на исправление ошибок в них, если такие обнаружатся. Минус же в том, что если вдруг выясняется какая-либо дыра, то все, кто использует этот модуль становятся уязвимы. Вполне возможно, что никого твой сайтик особо и не интересовал, чтобы искать в нём дыры, даже если их там много. Но вот опробовать нечто уже готовое на нём - почему бы нет.
В большинстве случаев быстрота разработки и достаточная надёжность перевешивают необходимость в излишней гибкости. Ну мало кто хочет себе признаться "я делаю хреновый сайт, на котором будет полтора человека и пофиг на все дыры, как-нибудь сам слеплю".
Хотя в целях обучения можно было бы попробовать написать нужную функциональность самому вместо использования готового модуля.

Проверка сервиса на thread-safe

Подскажите, пожалуйста, является ли thread-safe следующая реализация сервиса.
public class TaskReport {
private final String taskID; private final Date startTime = new Date(); private Date endTime = null; private final List report = new ArrayList(); private volatile boolean completed = false;
public TaskReport(String taskID) { this.taskID = taskID; }
public String getTaskID() { return taskID; }
public Date getStartTime() { return startTime; }
public Date getEndTime() { synchronized ( endTime ) { return endTime; } }
public void append(String entry) { synchronized ( report ) { report.add(entry); } }
public List getReport() { synchronized ( report ) { return report; } }
public boolean isCompleted() { return completed; }
public void setCompleted() { this.completed = true; synchronized ( endTime ) { this.endTime = new Date(); } }
}
public class TaskReportService {
private final ConcurrentHashMap tasks = new ConcurrentHashMap<>();
public TaskReport get(String key) { return tasks.get(key); }
public void create(TaskReport report) { tasks.putIfAbsent(report.getTaskID(), report); }
public void delete(String key) { tasks.remove(key); }
}
Насколько я понимаю ConcurrentHashMap обеспечивает потокобезопасность только атомарных операций, т.е. еще необходима дополнительная синхронизация содержимого. А не может ли в такой ситуации возникнуть дедлока?


Ответ

В этом коде много проблем с потокобезопасностью, хотя многие вещи зависят от того, как он используется. Например, TaskReportService.create
public void create(TaskReport report) { tasks.putIfAbsent(report.getTaskID(), report); }
Вас точно устраивает ситуация, что созданный снаружи кем-то TaskReport может быть помещён в map, а может и не быть? Причём вы никак не узнаете, был ли он помещён. Я могу снаружи сделать:
TaskReport report = new TaskReport("foo"); service.create(report); report.append("bar");
При этом совершенно неизвестно, сохранилась ли строчка "bar" или нет. Допустим вы всегда вызываете service.create для свежесозданного TaskReport, а потом его не используете. Зачем тогда его создание выносить наружу, раз это может привести к потенциальным проблемам? Не проще ли сделать метод getOrCreate?
public TaskReport getOrCreate(String key) { TaskReport report = tasks.get(key); if(report != null) return report; // Нету - создаём TaskReport newReport = new TaskReport(key); TaskReport oldReport = tasks.putIfAbsent(key, newReport); if(oldReport != null) { // Ой, кто-то в другом потоке только что создал с тем же ключом вперёд нас // Выкидываем наш новый и возвращаем тот, что есть return oldReport; } // Возвращаем свежесозданный return newReport; }
Теперь если вы будете для создания TaskReport пользоваться только этим методом, у вас гарантировано не будет двух репортов для одного ключа, по крайней мере пока вы не начнёте удалять и создавать с тем же ключом.
Кстати, если у вас Java-8, вышеприведённый метод будет однострочным:
public TaskReport getOrCreate(String key) { return tasks.computeIfAbsent(key, TaskReport::new); }
Далее — класс TaskReport. Тут тоже многое зависит от того, как он используется. Попытки синхронизации подсказывают, что один и тот же TaskReport может использоваться из нескольких потоков одновременно. Вот такой код абсолютно бесполезен:
public Date getEndTime() { synchronized ( endTime ) { return endTime; } }
Вы совершенно ни от чего не защищаетесь. А вот это ещё хуже:
synchronized ( endTime ) { this.endTime = new Date(); }
На это вроде даже FindBugs ругается. Бессмысленно синхронизоваться по объекту в поле и присваивать в это же поле другое значение. Надо сперва понять, от чего вы защищаетесь. Если вы не собираетесь менять содержимое объектов Date (например, вызывая Date.setTime()), то вам нечего защищать. В крайнем случае объявите поле endTime как volatile, чтобы изменения были видны в других потоках сразу. Синхронизация здесь излишня и бесполезна.
Аналогично бесполезно вот это:
synchronized ( report ) { return report; }
Когда вы уже вернёте ArrayList наружу, блок синхронизации завершится и дальше всё зависит от того, что будет делать внешний пользователь с этим списком. Если он собрался обходить его итератором (например, чтобы вывести строки в интерфейсе пользователя), вас не спасает ни синхронизация в append, ни в этом методе. Вы можете словить ConcurrentModificationException или чего похуже. Вас не спасёт даже оборачивачивание списка в Collections.synchronizedList. Здесь я вижу три варианта:
Если вы часто пишете и редко читаете, проще вернуть копию:
public List getReport() { synchronized ( report ) { return new ArrayList<>(report); } } Если вы редко пишете и часто читаете, можно воспользоваться CopyOnWriteArrayList
private final List report = new CopyOnWriteArrayList();
В этом случае синхронизация не нужна вообще (ни в append, ни в геттере). Просто верните report в геттере. Можно обернуть в Collections.unmodifiableList для безопасности. Если вы часто пишете и часто читаете, но вам не нужен случайный доступ, воспользуйтесь ConcurrentLinkedDeque:
private final Collection report = new ConcurrentLinkedDeque();
public Collection getReport() { return Collections.unmodifiableCollection(report); }
В этом случае тоже в append синхронизация не нужна.

Передача массива из функции

Бинарный файл составляю из 2 source-файлов, в одном основной код, в другой функции генерации ssl-сертификата. Функция формирования сертификата (дополнительные функции не привожу) из второго файла.
int create_cert(unsigned char *buf, int *len) { BIO *bio_err; X509 *x509=NULL; EVP_PKEY *pkey=NULL; unsigned char *p; int i;
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); mkcert(&x509,&pkey,2048,0,1490);
*len=i2d_X509(x509,NULL); buf=malloc(*len); if (buf==NULL) return -1; p=buf; i2d_X509(x509,&p);
X509_free(x509); EVP_PKEY_free(pkey); #ifndef OPENSSL_NO_ENGINE ENGINE_cleanup(); #endif CRYPTO_cleanup_all_ex_data(); CRYPTO_mem_leaks(bio_err); BIO_free(bio_err);
return 1; }
Тут я генерирую сертификат средствами openssl, с помощью i2d_X509 перевожу в DER-формат и записываю в память под указателем buf (а так же размер массива сертификата), который должен возвратиться туда где я вызываю эту функцию (т.е. в основной файл).
А вот главная функция первого файла.
int main(void) { char Cert; unsigned char *cbCertificate; int certLen;
create_cert(&cbCertificate,&certLen); }
Тут я принимаю указатель и размер массива сертификата с предыдущей функции. Все никак не могу понять как можно взять массив из памяти и присвоить его в переменную Cert, чтобы после передать другой функции. Я попытался записать сертификат в файл с помощью
FILE *fp=fopen("cert.cer","w"); if (fp!=NULL) { fwrite(&cbCertificate,1,certLen,fp); fclose(fp); }
Записывается всякая хрень. Я понимаю что cbCertificate это указатель на указатель. Я понимаю как можно взять адрес указателя, но вот к данным получить доступ не понимаю как.


Ответ

Если я правильно Вас поняла, и Вы хотите вернуть из внутренней функции наружу выделенный внутри нее массив, используя в качестве параметра этой функции двойной указатель, то, для начала, нужно описать в параметрах этой функции двойной указатель
int create_cert(unsigned char **buf, int *len){...}
Далее, выделять память под массив Вам нужно с учетом, что вы используете двойной указатель (Вы аналогично уже работаете с len):
*buf = (unsigned char *)malloc(*len);
Тогда, после вывова функции create_cert() в cbCertificate будет лежать указатель на новый, выделенный внутри create_cert() массив.
Все никак не могу понять как можно взять массив из памяти и присвоить его в переменную Cert
Так, как у Вас описано, это точно не получится, так как переменная Cert у вас имеет тип char, - т.е. 1 элемент. Нельзя одному элементу типа char присвоить весь массив.
Если же Вы, после того, как получили с помощью функции create_cert() данные, хотите записать их в файл, то запись будет выглядеть вот так :
fwrite(cbCertificate,1,certLen,fp);
так как
unsigned char *cbCertificate;
это не двойной, а обычный указатель. Вот когда вы берете его адрес, как здесь :
create_cert(&cbCertificate,&certLen);
внутри функции create_cert() получается двойной указатель.
UPD: Как выглядят двойные указатели:
Объявление :
int **cbCertificate;
Тогда инициализация такого указателя может выглядеть вот так :
int a = 0; int *ptr = &a; int **cbCertificate = &ptr;
И передавать такой двойной указатель в функцию можно будет вот так :
void foo(int ** pptr){...} ... int main(){ int a = 0; int *ptr = &a; int **cbCertificate = &ptr;
foo(cbCertificate); }
Если же двойной указатель нам нужен только для того, чтобы вернуть из функции адрес выделенного внутри этой функции буффера, то можно обойтись использованием двойного указателя только на стеке функции, тогда вышеприведенный пример можно записать так :
void foo(int ** pptr){...} ... int main(){ int a = 0; int *ptr = &a;
foo(&ptr); }
Двойной указатель является не чем иным, как адресом некоторого указателя, следовательно, работать с самим указателем и данными внутри функции foo() можно следующим образом:
void foo(int **pptr){ ... *pptr = NULL; // инициализация указателя, адрес котрого хранится в pptr //(pptr все еще хранит значение, указывающее на некоторую ячейку памяти, //а вот эта самая память уже никуда не указывает) *pptr = (int *)malloc(10*sizeof(int)); // ячейка, на которую указывает // pptr, указывает на массив из 10 значений типа int
(*pptr)[0] = 5; // инициализируем первый элемент выделенного массива ... }

Обработка ошибок в Rust

Есть программа на rust, взятая отсюда: Учебник по Rust
Захотелось мне, чтобы программа постоянно выводила собственный префикс ("guess_game>> "). По-этому немного пришлось подкорректировать строки перед запросом ввода.
В оригинале было так
println!("Пожалуйста, введите предположение.");
Если просто заменить println! на print!, у меня вывод сбрасывался на терминал слишком поздно. Выход был найден в принудительном вызове stdout().flush(). Но, когда я добавил обработку ошибок, как приведена ниже, при запуске программы стали бесконечно рисоваться строки "guess_game>> try: ". Прошу объяснить, почему так и какова логика?
extern crate rand;
use std::io::stdin; use std::io::Write; use std::io::stdout; use rand::Rng; use std::cmp::Ordering;
fn main() { let snum = rand::thread_rng().gen_range(1, 101); println!("guess_game>> rnd: {}", snum);
loop { let mut guess = String::new();
print!("guess_game>> try: "); match stdout().flush() { Ok(_) => continue, Err(_) => continue, };
stdin().read_line(&mut guess) .ok() .expect("Fail read line");
let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, };
match guess.cmp(&snum) { Ordering::Less => println!("guess_game>> Less"), Ordering::Equal => { println!("guess_game>> Equal"); break; } Ordering::Greater => println!("guess_game>> Greater"), } } }
UPD: Решение:
print!("guess_game>> try: "); match stdout().flush() { Ok(_) => (), Err(_) => (), };


Ответ

У вас бесконечно выводится guess_game>> try: по тому, что у вас получился бесконечный цикл.

Форматирование вывода данных в консоли


Как красиво вывести числа в несколько столбцов, чтобы они не скакали?
Код:
for (int i = 0; i < 1000; i++) { if (i % 3 == 0 || i % 5 == 0) { Console.Write(i + " | "); sum += i; } }


Ответ

Попробуйте следующий код:
int sum = 0; int count = 0; for (int i = 0; i < 1000; i++) { if (i % 3 == 0 || i % 5 == 0) { Console.Write("{0, 7} | ", i); sum += i; count++; if (count == 8) { count = 0; Console.WriteLine(); } } }
Обратите внимание на следующее:
Для выравнивания выдачи чисел используется строка формата {0, 7}. Подробнее: MSDN Для сохранения столбцов от строки к строке, после каждых 8 чисел выдается перевод строки: Console.WriteLine()

Вызов функции из другого файла

Есть общий файл (main.js) для всех скриптов, в нём прописана функция для кнопки "наверх":
function button_top_right (n) { var top_button = $("#main").offset().top; $("#top_right").hide(); $(window).scroll(function () { if ($(this).scrollTop() > top_button + n) { $('#top_right').fadeIn().addClass("fixed"); } else { $('#top_right').fadeOut(); } }); }; button_top_right (1500);
Для одной страницы мне надо вызвать эту функцию с другим параметром n Добавляю скрипт на эту страницу:
$(document).ready(function () { button_top_right (100); });
Скрипт не срабатывает с ошибкой:
Uncaught ReferenceError: button_top_right is not defined
main.js подгружается раньше, чем вызов функции. Что я делаю не так?


Ответ

Когда функция объявлена внутри document.ready, обратиться к ней извне не получится. Достаточно вынести саму функцию, а её вызовы оставить внутри document.ready
function button_top_right(n) { ... }; $(document).ready(function() { button_top_right(1500); });
Так как внутри функции button_top_right при каждом вызове функции добавляется обработчик события scroll для window, имеет смысл убирать предыдущий обработчик либо перед вызовом функции, либо внутри функции перед добавлением нового:
$(window).off("scroll").on("scroll", function() { ... });

Для чего используют out в обобщенных интерфейсах

Столкнулся с объявлением обобщенного интерфейса с использованием out
public interface IContainer { ... }
Никак не могу понять для чего используют out, по механизму это похоже на использование ref и out в методах или это из другой области?


Ответ

in и out в интерфейсах — это ковариантность и контравариантность
Благодаря out, IEnumerable является IEnumerable, а благодаря in, а IComparer является IComparer
Есть хорошая статья на MSDN с примерами из фреймворка: Covariance and Contravariance in Generics

Получить указатель на новый элемент вектора c++

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


Ответ

Если вас интересует именно указатель на добавленный элемент, а не итератор, то вы можете его получить, допустим, следующим образом:
#include #include #include
int main() { std::vector> v;
v.emplace_back( int( 'A' ), 'A' );
auto p = &v.back();
std::cout << p->first << ": " << p->second << std::endl; }
Вывод программы на консоль:
65: A
Ежели вы используете метод insert вместо одного из методов всавки в конец вектора, то метод insert возвращает итератор на вставленный элемент. Поэтому вы можете получить указатель на элемент, используя этот итератор. Например,
#include #include #include
int main() { std::vector v = { 1, 2, 4, 5 };
auto it = v.insert( std::find( v.begin(), v.end(), 4 ), 3 );
int *p = &*it;
std::cout << *it << "\t" << *p << std::endl; }
Вывод программы на консоль:
3 3
В программе для обращения к вставленному элементу используется как итератор, так и указатель.
Также так как вы можете обращаться к элементам вектора, используя оператор индексации, то вы всегда можете получить указатель на любой элемент, зная его индекс. например,
std::vector v = { 1, 2, 3, 4, 5 };
int *p = &v[2];
Имейте в виду, что когда элемент вектора удаляется, то все элементы, стоящие за удаляемым элементом, сдвигаются к началу вектора, занимая место удаленного элемента, если только удаленный элемент не был последним элементом вектора. То есть элементы вектора всегда располагаются последовательно друг за другом в непрерывном участке памяти. Никаких "дыр" в векторе не бывает.
Если вам надо вставлять элементы в середину вектора, то лучше будет использовать std::deque, или если прямой доступ к элементам не нужен, то std::list

Приложения Android, при упаковке в dex-файл, имеют жёсткое ограничение

Приложения Android, при упаковке в dex-файл, имеют жёсткое ограничение в 65536 ссылочных методов. что это означаем? и как узнать сколько у меня ссылочных методов?


Ответ

что это означаем?
это означает Dalvik 65K methods limit:
Вы можете ссылаться на очень большое число методов в DEX файле, но вызывать можете только первые 65536, потому что это вся память, которая у вас есть для инструкции вызова метода. [...] ограничено число методов на которые вы можете сослаться, а не число определенных вами методов. Другими словами, если ваш DEX файл содержит всего несколько методов, но вместе они вызывают 70 000 различных внешне-определенных методов — вы превысите лимит.
и как узнать сколько у меня ссылочных методов?
как вариант с помощью dex-method-counts

source

Как сделать sql-запрос так, чтобы он добавил только те элементы, которых нет в БД?

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


Ответ

Вам надо объявить уникальный индекс или сделать первичным ключем поле со "словом", чтобы гарантировать, что дубликат не будет создан даже при сбое в скрипте. Затем, в зависимости от контекста задачи, вы можете выбрать:
INSERT IGNORE - не-добавление того, что не должно быть добавлено. если вставляете пачкой несколько строк, IGNORE спасет от отмены всей операции; INSERT ON DUPLICATE KEY UPDATE - при обнаружении дубля, сработает "запасной вариант" с обновлением только того, что укажете; REPLACE - фактически делает DELETE и затем INSERT.
Cмотрите: https://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update

Что такое апартаменты COM

Зачем они вообще нужны? Каких видов бывают? И куда их прикладывать?


Ответ

COM-апартаменты -- это модель работы с потоками в COM. Она родилась как способ безопасного использования COM-объектов, предназначенных только для однопоточного использования, в многопоточном окружении.
Есть два типа апартаментов:
STA (single-thread apartment, однопоточные апартаменты) MTA (multiple-thread apartment, многопоточные апартаменты)
Преимуществом MTA-апартаментов является потенциально более высокая производительность за счет использования нескольких потоков.
Внутри одного процесса м.б. несколько STA-апартаментов и один MTA-апартамент. Каждый COM-объект создается либо в STA, либо в MTA-апартаменте. При это объект, созданный в одном типе апартамента, не может быть напрямую вызван из апартамента другого типа. Для этого нужно использовать прокси.
Время жизни объекта ограничено временем жизни апартамента, в котором он находится. Каждый COM-компонент содержит объявление, в какой модели он может работать. При этом важно помнить, что если вы собираетесь работать в MTA-апартаменте, то должны обеспечить синхронизацию, в то время как для STA заботиться об этом не нужно.

Приложение, способное восстановиться после убийства системой

Пытаюсь создать приложение, которое при получении телефоном входящего смс считывает его содержимое плюс номер и записывает в свою БД. Информацию о поступлении смс приложение получает через BroadcastReceiver, работая в фоновом режиме.
Требуется следующее: приложение должно восстанавливаться после того, как система убьет его из-за нехватки ресурсов.
Как это реализовать?


Ответ

Добавьте в onCreate вашей основной активити:
intent = PendingIntent.getActivity(YourApplication.getInstance().getBaseContext(), 0, new Intent(getIntent()), getIntent().getFlags());
И в uncaughtException()
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, intent); System.exit(2);

Функции из в borland turbo c++

На древнем borland turbo c++ для dos надо запустить программу, которая, предположим, сортирует массив. Насколько я знаю, в borland turbo c++ заголовочного файла с названием "algorithm" нет.
В таком случае, какую библиотеку сюда подключать?


Ответ

Если вам нужна сортировка, то вы можете использовать стандартную C библиотеку и использовать функцию qsort
Думаю, что и в библиотеках Turbo C++ также где-нибудь определена функция sort. Если я не ошибаюсь, то в Turbo C++ входит Turbo Vision. Вы можете посмотреть библиотеки этого пакета.
Также в Turbo C++ должна входить встроенная онлайн документация. И кроме того вы можете поискать в интернет соответствующий материал.
Можно найти список заголовочных файлов. Сортировка может быть в заголовке , если таковой имеется:).

Android: ListView внутри ScrollView - нельзя. Чем заменить ListView?

Везде пишут, что такое делать нельзя. Но тогда каким образом можно на андроиде реализовать такое (из моего приложения для iOS):

(текст и tableview - аналог listview для андроид, преспокойно скролятся вместе внутри одного scrollview).


Ответ

Можно использовать LinearLayout вместо ListView
LinearLayout linearLayout = (LinearLayout) findViewById(...); LayoutInflater inflater = LayoutInflater.from(this); for (item in arrayList) { View view = inflater.inflate(R.layout.row, linearLayout, false); linearLayout.addView(view) }
Или с адаптером
LinearLayout layout = ... ListAdapter adapter = ...
final int adapterCount = adapter.getCount();
for (int i = 0; i < adapterCount; i++) { View item = adapter.getView(i, null, null); layout.addView(item); }

выполнение функции по истечению времени

в моей программе есть функция,которая должна выполняться только в определенное время(дд/мм/гггг).Пользователь вводит дату,и только в это время функция выполняеться. как реализовать таймер?


Ответ

Одним из миллиона способов. Например, так:
async Task ExecuteAfter(DateTime when, Action function) { DateTime now = DateTime.Now; if (when > now) await Task.Delay(when - now); function(); }

Другой метод:
DateTime now = DateTime.Now; if (when <= now) { function(); } else { var milliseconds = (when - now).TotalMilliseconds; var timer = new System.Timers.Timer(milliseconds) { AutoReset = false }; timer.Elapsed += (o, args) => { function(); timer.Stop(); timer.Dispose(); }; // если вы пишете на WinForms, можете указать ещё // timer.SynchronizingObject = // чтобы вызов произошёл в UI-потоке timer.Start(); }

Ещё один:
DateTime now = DateTime.Now; if (when <= now) { function(); } else { System.Threading.Timer timer = null; timer = new System.Threading.Timer( o => { function(); timer.Dispose(); }, null, when - now, TimeSpan.Zero); }

Ещё один подход — использование синхронизационных примитивов и ожидание с таймаутом события, которое никогда не наступит. Например, при помощи семафора:
DateTime now = DateTime.Now; if (when > now) using (var sema = new SemaphoreSlim(0)) sema.Wait(when - now); function();
(Не рекомендуется, блокирует текущий поток!)

Ещё один метод, использование потоков + Sleep. Не рекомендуется, т. к. блокирует поток, а это ненужный расход ресурсов. Наихудший метод — блокирование текущего потока:
DateTime now = DateTime.Now; if (when > now) Thread.Sleep(when - now); function();
Чуть лучше идея с выгрузкой в отдельный поток:
new Thread(() => { DateTime now = DateTime.Now; if (when > now) Thread.Sleep(when - now); function(); }) { IsBackground = true }.Start();
Ещё чуть-чуть лучше использовать thread pool (но всё равно плохо):
ThreadPool.QueueUserWorkItem(o => { DateTime now = DateTime.Now; if (when > now) Thread.Sleep(when - now); function(); });